使用统一解析global.asax中的HomeController
问题描述:
我有一个具有依赖注入的控制器。使用统一解析global.asax中的HomeController
构造家居控制器:
public HomeController(ICustomer customer, ISiteSettings siteSettings, ILogger logger, ILocalizer localizer)
: base(customer, siteSettings, logger, localizer)
{
}
我想从在Global.asax用下面的代码返回一个ActionResult:
IController controller = new HomeController(dependency should go here);
,我想统一解决的依赖(客户, siteSettings,logger,localizer),而不是在global.asax上创建依赖关系,并将其传递给控制器。
somecode像下面应该工作,但我还没有能够得到它排序:
IController controller = UnityManager.Instance.Resolve(controllerType) as IController;
答
,这里是如何我终于解决了它:
IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(HttpContext.Current.Request.RequestContext, "Home");
controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));
答
你首先必须配置您的团结DI容器。通常的做法是创建一个引导程序,用一个静态方法来处理登记,如:
public class ContainerBootstrapper {
public static void RegisterTypes(IUnityContainer container) {
container.RegisterType<ICustomer, CustomerImplementation>(/* configure your class implementation here */);
container.RegisterType<ISiteSettings, SettingsImplementation>(...);
container.RegisterType<ILogger, LoggerImplementation(...));
...
}
}
,并从您的Global.asax调用它
var container = new UnityContainer();
ContainerBootstrap.RegisterTypes(container);
在ASP.NET解决控制器MVC4应用程序,您需要更换标准的Controller工厂实现。欲了解更多信息,请查看Unity documentation on MSDN。 有一个“团结引导程序的ASP.NET MVC” NuGet包可用,其中容器中的标准UnityDependencyResolver
实现,你只需要注册它:
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
这些都已完成。现在我需要在global.asax中调用一个actionresult,而我无法找到如何解决actionresult坐在那里的控制器。 – user3311522