【发布时间】:2015-02-10 03:58:00
【问题描述】:
作者提供了一个exampleMediatR如何在使用Autofac的控制台应用程序中使用:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterAssemblyTypes(typeof (IMediator).Assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof (Ping).Assembly).AsImplementedInterfaces();
builder.RegisterInstance(Console.Out).As<TextWriter>();
var lazy = new Lazy<IServiceLocator>(() => new AutofacServiceLocator(builder.Build()));
var serviceLocatorProvider = new ServiceLocatorProvider(() => lazy.Value);
builder.RegisterInstance(serviceLocatorProvider);
我举了这个例子并尝试让它与 ASP MVC 5 和 Autofac.Mvc5 包一起工作:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterAssemblyTypes(typeof(IMediator).Assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(AddPostCommand).Assembly).AsImplementedInterfaces();
builder.RegisterControllers(typeof(HomeController).Assembly);
var container = builder.Build();
var lazy = new Lazy<IServiceLocator>(() => new AutofacServiceLocator(container));
var serviceLocatorProvider = new ServiceLocatorProvider(() => lazy.Value);
builder.RegisterInstance(serviceLocatorProvider);
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
当我运行 Web 应用程序时,我收到一个错误页面,告诉我 ServiceLocationProvider 依赖项尚未注册。我究竟做错了什么?
我怀疑问题是由于我正在注册ServiceLocatorProvider 实例之后调用Build - 在作者的示例中,@987654329由于Lazy<>,@ 方法随后被调用。不过,我不知道如何解决这个问题。
【问题讨论】:
标签: c# asp.net-mvc dependency-injection autofac mediatr