从广义上讲,我试图用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中是否可行?
谢谢。
答案 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();