依赖对象作为Autofac中依赖项的参数

时间:2016-07-18 15:53:29

标签: asp.net-mvc dependency-injection inversion-of-control autofac

从广义上讲,我试图用Autofac实现的是将依赖(a.k.a. parent)对象传递给它的依赖项。

例如:

interface IDependency {}

class Dependant
{
    IDependency Dependency { get; set; }
}

class ConcreteDependency : IDependency
{
    ConcreteDependency(Dependant dependant) { /* ... */ }
}

我希望这可行,因为Dependant使用属性注入打破了依赖循环(意味着你可以创建Dependant的实例,之前必须解决IDependency)。同时,如果两个类都使用ctor-injection,那就不可能了。

具体来说,我正在尝试当前的ASP.NET MVC控制器实例注入其中一个依赖项。

看看:

public abstract class ApplicationController : Controller
{
    public ILogger Logger { get; set;}
}

public class SomeController : ApplicationController
{
    [HttpPost]
    public ActionResult Create(FormCollection formData)
    {
        // something fails...
        this.Logger.Log("Something has failed.");
    }
}

public interface ILogger
{
    public void Log(string message);
}

public class TempDataLogger : ILogger
{
    private ControllerBase controller;

    public NullLogger(ControllerBase controller)
    {
        this.controller = controller;
    }

    public void Log(string message)
    {
        this.controller.TempData["Log"] = message;
    }
}

在简单的英语中,上面的代码使用TempData作为“记录”消息的一种方式(可能在视图布局中以一种很好的方式打印出来的东西......)。

简单的所有控制器都在Autofac中注册:

builder.RegisterControllers(typeof(MvcApplication).Assembly)
       .PropertiesAutowired(); // not strictly necessary

但是,我如何调整下面的ILogger注册以使其有效?

builder.RegisterType<TempDataLogger>()
       .As<ILogger>()
       .InstancePerRequest();

这在Autofac中是否可行?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果其他人感兴趣,下面的解决方案是我迄今为止最接近的解决方案:

builder.RegisterControllers(typeof(MvcApplication).Assembly)
       .PropertiesAutowired() // not strictly necessary
       .OnActivating(e => ((ApplicationController)e.Instance).Logger = new TempDataLogger((ApplicationController)e.Instance));

......因此,不需要;

builder.RegisterType<TempDataLogger>()
       .As<ILogger>()
       .InstancePerRequest();