1

我有几个方法属性可以做一些记录。我们的日志记录代码位于接口 (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 容器 - 但任何可行的方法都可以)?

4

2 回答 2

4

请参阅这篇文章 - 如何使用 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

于 2010-07-02T08:26:18.497 回答
1

您能否不将记录器设为接口并将其传递给 Attribute 中的属性或通过构造函数:

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

    ...
}

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

于 2009-10-20T22:07:14.027 回答