我们正在使用依赖注入和IoC(Unity),现在我想用PostSharp制作一个方面,它基本上会记录方法的输入/退出。我的问题是我的记录器配置并注册在统一容器中。在我的方面,解决记录器的最佳方法是什么?PostSharp方面解析类型
注意:统一使用拦截器不是一种选择。我希望这个工作没有通过团结解决。
我们正在使用依赖注入和IoC(Unity),现在我想用PostSharp制作一个方面,它基本上会记录方法的输入/退出。我的问题是我的记录器配置并注册在统一容器中。在我的方面,解决记录器的最佳方法是什么?PostSharp方面解析类型
注意:统一使用拦截器不是一种选择。我希望这个工作没有通过团结解决。
使用一个从OnMethodBoundaryAspect继承的方面,并在OnMethodEntry/OnMethodExit中调用您的方面调用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);
}
}
没有一个服务定位器
在应用程序中的init方法中添加静态属性记录在你的类看点
public class LogAspect : OnMethodBoundaryAspect
{
/// <summary>
/// Gets or sets the logger.
/// </summary>
public static ILogger logger { get; set; }
集记录变量与ILogger类和排除这种初始化之前的所有方法与AttributeExclude。
[LogAspect(AttributeExclude = true)]
protected void Application_Start()
{
_windsorContainer = new WindsorContainer();
ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
LogAspect.logger = _windsorContainer.Resolve<ILogger>();
为什么你想静态(后)编译的东西到你的代码,当你可以保持动态和灵活的拦截器? – 2011-04-20 14:13:12
好吧,主要是因为这些类不是容器的一部分 – Michael 2011-05-03 11:28:14