我们正在使用依赖注入和控制反转(Unity)技术,现在我想使用PostSharp创建一个方面,基本上记录方法的进入/退出。我的问题是我的记录器已在 Unity 容器中配置和注册。在我的方面中解决记录器的最佳方法是什么?
注意:在 Unity 中使用拦截器不是一种选择。我希望这可以在没有通过 Unity 解析类的情况下工作。
注意:在 Unity 中使用拦截器不是一种选择。我希望这可以在没有通过 Unity 解析类的情况下工作。
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, Inheritance=MulticastInheritance.Strict)]
public class LogAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
var Logger = Unity.Resolve<T>();
Logger.Write(args.Method.Name + " enter");
}
public override void OnExit(MethodExecutionArgs args)
{
var Logger = Unity.Resolve<T>();
Logger.Write(args.Method.Name + " exit");
}
}
public class iocServiceLocator
{
private static readonly IUnityContainer _container;
static iocServiceLocator()
{
_container = new UnityContainer();
}
public static void Initialize()
{
InitializeBootStrap();
}
private static void InitializeBootStrap()
{
//Register types here
}
public static T Get<T>()
{
return _container.Resolve<T>();
}
public static T Get<T>(string key)
{
return _container.Resolve<T>(key);
}
}
不使用服务定位器
在你的 Aspect 类中添加一个静态属性 logger
public class LogAspect : OnMethodBoundaryAspect
{
/// <summary>
/// Gets or sets the logger.
/// </summary>
public static ILogger logger { get; set; }
[LogAspect(AttributeExclude = true)]
protected void Application_Start()
{
_windsorContainer = new WindsorContainer();
ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
LogAspect.logger = _windsorContainer.Resolve<ILogger>();