我有一些方法属性可以进行一些日志记录。我们的日志代码位于接口(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容器 - 但是任何有效的依赖都可以)?
答案 0 :(得分:4)
请参阅此文章 - 如何使用Ninject将依赖项注入ASP.NET MVC ActionFilters
答案 1 :(得分:1)
你能不能让logger成为一个接口并将它传递给Attribute中的属性或通过构造函数传递:
LoggerAttribute
{
[Dependency]
public ILogger Logger {get; set;}
...
}
如果是我,虽然我会把记录器放在基类中并在其上设置属性。