使用统一解析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)); 
+0

这些都已完成。现在我需要在global.asax中调用一个actionresult,而我无法找到如何解决actionresult坐在那里的控制器。 – user3311522