C# 使用unity解析global.asax中的HomeController
我有一个具有依赖注入的控制器 家庭控制器的构造:C# 使用unity解析global.asax中的HomeController,c#,asp.net-mvc,dependency-injection,unity-container,global-asax,C#,Asp.net Mvc,Dependency Injection,Unity Container,Global Asax,我有一个具有依赖注入的控制器 家庭控制器的构造: public HomeController(ICustomer customer, ISiteSettings siteSettings, ILogger logger, ILocalizer localizer) : base(customer, siteSettings, logger, localizer) { } 我想使用以下代码从global.asax返回actionresult: IContr
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);
我希望unity解决依赖关系(客户、站点设置、记录器、定位器),而不是在global.asax上再创建一次依赖关系并将其传递给controller
下面这样的代码应该可以工作,但我一直无法对其进行排序:
IController controller = UnityManager.Instance.Resolve(controllerType) as IController;
您首先必须配置Unity 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(...));
...
}
}
要解析ASP.NET MVC4应用程序中的控制器,需要替换标准控制器工厂实现。有关更多信息,请查看。
有一个“Unity bootstrapper for ASP.NET MVC”nuget软件包可用,它包含了一个标准的UnityDependencyResolver
实现,您只需向以下注册即可:
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
以下是我最终解决问题的方法:
IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(HttpContext.Current.Request.RequestContext, "Home");
controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));
这些都完成了。现在我需要在global.asax中调用actionresult,我无法找到如何解析actionresult所在的控制器。
IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(HttpContext.Current.Request.RequestContext, "Home");
controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));