我有一个具有依赖注入的控制器。
家庭控制器的构造函数:
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);
我希望团结解决依赖关系(customer,siteSettings,logger,localizer),而不是再次在global.asax上创建依赖关系并将其传递给控制器。
如下所示的某些代码应该可以正常工作,但我还是无法对其进行排序:
IController controller = UnityManager.Instance.Resolve(controllerType) as IController;
答案 0 :(得分:1)
您首先必须配置Unity DI容器。通常的做法是创建一个bootstrapper,使用静态方法来处理注册,如:
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的Unity引导程序”nuget包可用,它包含一个标准的UnityDependencyResolver
实现,你只需要注册它:
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
答案 1 :(得分:0)
以下是我最终解决的问题:
IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(HttpContext.Current.Request.RequestContext, "Home");
controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));