【问题标题】:Dependency Injection and .NET Attributes依赖注入和 .NET 属性
【发布时间】:2009-10-20 21:48:41
【问题描述】:

我有几个方法属性可以做一些记录。我们的日志记录代码位于接口 (ILog) 后面,如果属性仅依赖于该接口而不是实现,我会喜欢它。这实际上并不是关于可测试性或依赖倒置,而是关于保持组件的耦合清洁。

一个例子是我们有一个 web (Mvc) 特定属性,如下所示:

HandleExceptionAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        LogFactory.CreateInstance().Info("message here", "log entry type");
    }
}

LogFactory 依赖于具体的实现 Log.cs。这具有将我的 Web DLL 耦合到包含具体实现的 DLL 的不幸效果——使整个系统更加僵化和脆弱。

在任何其他明显存在这种依赖关系的位置,我们只需使用 IOC 容器来注入它。这正是我现在想要对属性执行的操作,但我不确定如何操作!

所以,我的问题是:如何将具体的依赖项注入到接口后面的 .NET Framework 属性中(最好通过像 StructureMap 这样的 IOC 容器 - 但任何可行的方法都可以)?

【问题讨论】:

    标签: .net dependency-injection attributes ioc-container decoupling


    【解决方案1】:

    请参阅这篇文章 - 如何使用 Ninject 将依赖项注入 ASP.NET MVC ActionFilters

    http://codeclimber.net.nz/archive/2009/02/10/how-to-use-ninject-to-inject-dependencies-into-asp.net-mvc.aspx

    【讨论】:

    • 这真的很好——我不使用 Ninject(StructureMap 是我选择的 IOC),但同样的原则应该完美地适用于任何主要容器——覆盖 ActionInvoker 是我需要了解更多的东西关于...干杯,
    【解决方案2】:

    你能不能让记录器成为一个接口并将它传递给属性中的一个属性或通过构造函数:

    LoggerAttribute
    {
        [Dependency]
        public ILogger Logger {get; set;}
    
        ...
    }
    

    如果是我,我会去把记录器放在一个基类中并在它上面设置一个属性。

    【讨论】:

    • 这可能是我最终要走的路线 - 我只需要使用 Attributes 和 StrucuteMap 弄清楚注入...
    • 我遇到了同样的问题,我选择使用属性而不是构造函数参数,因为属性仅在应用于类型时支持常量值。所以我不认为在属性上使用构造函数参数是一种选择(除非你注入常量值)。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 2015-07-07
    • 2011-11-16
    • 2016-05-22
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多