C# 后向分辨型

C# 后向分辨型,c#,dependency-injection,aop,postsharp,C#,Dependency Injection,Aop,Postsharp,我们正在使用依赖注入和IoC(Unity),现在我想用PostSharp创建一个方面,基本上记录方法的进入/退出。我的问题是我的记录器在unity容器中配置和注册。在我的方面,解决记录器问题的最佳方法应该是什么 注意:在unity中使用拦截器不是一个选项。我希望在没有通过unity解析类的情况下,该类也能正常工作。使用从OnMethodBoundaryAspect继承的aspect,在OnMethodEntry/OnMethodExit中,只需从aspect调用unity解析记录器,然后进行日志

我们正在使用依赖注入和IoC(Unity),现在我想用PostSharp创建一个方面,基本上记录方法的进入/退出。我的问题是我的记录器在unity容器中配置和注册。在我的方面,解决记录器问题的最佳方法应该是什么


注意:在unity中使用拦截器不是一个选项。我希望在没有通过unity解析类的情况下,该类也能正常工作。

使用从OnMethodBoundaryAspect继承的aspect,在OnMethodEntry/OnMethodExit中,只需从aspect调用unity解析记录器,然后进行日志记录

以任何方式应用方面(类、方法甚至程序集级别)

[可序列化]
[MulticastAttributeUsage(MulticastTargets.Method,继承=MulticastHeritance.Strict)]
公共类LogAspect:OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
var Logger=Unity.Resolve();
Write(args.Method.Name+“回车”);
}
公共重写void OnExit(MethodExecutionArgs args)
{
var Logger=Unity.Resolve();
Write(args.Method.Name+“exit”);
}
}
要获取unity容器,我将使用服务定位器模式

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);
        }


    }
公共类iocServiceLocator
{
专用静态只读IUnityContainer\u容器;
静态iocServiceLocator()
{
_容器=新的UnityContainer();
}
公共静态void Initialize()
{
初始化bootstrap();
}
私有静态void初始化bootstrap()
{
//在这里注册类型
}
公共静态不获取()
{
返回_container.Resolve();
}
公共静态T Get(字符串键)
{
返回_container.Resolve(键);
}
}

无服务定位器

在类方面中添加静态属性记录器

public class LogAspect : OnMethodBoundaryAspect
{
    /// <summary>
    /// Gets or sets the logger.
    /// </summary>
    public static ILogger logger { get; set; }
公共类LogAspect:OnMethodBoundaryAspect
{
/// 
///获取或设置记录器。
/// 
公共静态ILogger记录器{get;set;}
使用ILogger类在应用程序init方法中设置logger变量,并在此初始化之前使用AttributeExclude排除所有方法

    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();
[LogAspect(AttributeExclude=true)]
受保护的无效应用程序\u Start()
{
_windsorContainer=新windsorContainer();
ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
LogAspect.logger=\u windsorContainer.Resolve();

当您可以使用拦截器保持代码的动态性和灵活性时,为什么要静态(后期)编译代码?主要是因为这些类不是容器的一部分
    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();