无法向web api 2注入统一的复杂类型

时间:2015-05-22 12:50:55

标签: c# asp.net-web-api dependency-injection unity-container asp.net-web-api2

我有一个复杂的类型要注入webapi控制器,我无法解决这种依赖

 public class MyController(IMyComplexType)

IMyComplexType的实现至少有5个依赖项I1, ... I5(因此其实现接收I1...I5

我有一个Bootstrapper类来注册所有依赖项,在一段代码下面显示

    public class Bootstrapper
    {
        public static IUnityContainer ConfigureContainer(ref IUnityContainer container)
        {
            container.RegisterType<IMyComplexType, MyComplexTypeImplementation>
            (
              new HierarchicalLifetimeManager()
            );

            //Registering I1...I5 in the same way with their implementations
        }
     }

我试图直接加载Assmebly,所以I1 ... I5驻留在assembly1中,在ConfigureContainer方法的开头

Assembly.Load("assembly1");

我还从:WebApi dependency injection

复制了UnityResolver

这是我的WebApiConfig:

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            IUnityContainer container = new UnityContainer();
            Bootstrapper.ConfigureContainer(ref container);
            config.DependencyResolver = new UnityResolver(container);

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

我还尝试删除我的控制器上的injecton构造函数,并在Post方法中添加如下内容:

var service = Container.Resolve<IMyComplexType>() or var service = Container.Resolve<MyComplexTypeImplementation>()

我在这里失去了什么?

1 个答案:

答案 0 :(得分:1)

首先注册所有构造函数类型,然后注册其余类型。

HttpContext.Current.Application.SetContainer(container);
container.AddNewExtension<Interception>();
c.RegisterType<IYourType,YourType>();
...
futher constructor types here
...
c.RegisterType<IMyComplexType,MyComplexType>();

c.RegisterType<IMyController, MyController>(
            new HierarchicalLifetimeManager(), 
            new InjectionConstructor(typeof(IMyComplexType)));

然后

public static class WebApiBootstrapper
    {
        public static void Init(IUnityContainer container)
        {
            GlobalConfiguration.Configure(config =>
            {
                config.DependencyResolver = new WebApiDependencyResolver(container); // DI container for use in WebApi
                config.MapHttpAttributeRoutes();
                WebApiRouteConfig.RegisterRoutes(RouteTable.Routes);
            });
        }
    }