1

我有几个方法属性做一些日志记录。我们的日志代码位于一个接口(ILog)的后面,如果这些属性只依赖于该接口而不是实现,我希望它能够被使用。这不是关于可测试性或依赖性反转,而是关于保持组件的耦合清洁。依赖注入和.NET属性

一个例子是,我们有一个腹板(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容器 - 但任何工作都可以)?

回答

1

你能不能使记录器的接口,并把它传递到任何一个属性在属性或通过构造函数:

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

    ... 
} 

如果是我,虽然我会去把记录器在基类并在其上设置一个属性。

+0

这可能是我最终将会采取的路线 - 我只需要弄清楚注射使用Attributes和StrucuteMap ... – 2009-10-21 22:53:18

+0

我遇到了同样的问题,我选择使用属性而不是构造函数参数,因为属性只应用于类型时支持常量值。所以我不认为使用构造函数参数是一个选项,当用于属性(除非你注入常量值)。 – 2012-02-21 20:35:35