使用unity解析global.asax中的HomeController

时间:2014-02-14 19:18:54

标签: 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:

IController controller = new HomeController(dependency should go here);

我希望团结解决依赖关系(customer,siteSettings,logger,localizer),而不是再次在global.asax上创建依赖关系并将其传递给控制器​​。

如下所示的某些代码应该可以正常工作,但我还是无法对其进行排序:

IController controller = UnityManager.Instance.Resolve(controllerType) as IController;

2 个答案:

答案 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));