3

我试着按照this blog实现依赖注入与团结,但我在boostrapper.cs(我用Unity.MVC4库)得到一个错误。有人能指出我在这里失去了什么吗?依赖注入的ASP.NET Web API使用Unity错误

ERROR: IoCContainer does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator. Parameter name: commonServiceLocator

public static class Bootstrapper 
    { 
    public static IUnityContainer Initialise() 
    { 
     var container = BuildUnityContainer(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     // this throws "does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.... error" 
     DependencyResolver.SetResolver(new IoCContainer(container)); 

     return container; 
    } 

    .... 
    } 

这是

public class ScopeContainer : IDependencyScope 
    { 
     protected IUnityContainer container; 

     public ScopeContainer(IUnityContainer container) 
     { 
      if (container == null) 
      { 
       throw new ArgumentNullException("container"); 
      } 
      this.container = container; 
     } 

     public object GetService(Type serviceType) 
     { 
      if (container.IsRegistered(serviceType)) 
      { 
       return container.Resolve(serviceType); 
      } 
      else 
      { 
       return null; 
      } 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      if (container.IsRegistered(serviceType)) 
      { 
       return container.ResolveAll(serviceType); 
      } 
      else 
      { 
       return new List<object>(); 
      } 
     } 

     public void Dispose() 
     { 
      container.Dispose(); 
     } 
    } 

    class IoCContainer : ScopeContainer, IDependencyResolver 
    { 
     public IoCContainer(IUnityContainer container) 
      : base(container) 
     { 
     } 

     public IDependencyScope BeginScope() 
     { 
      var child = container.CreateChildContainer(); 
      return new ScopeContainer(child); 
     } 
    } 

的IoCContainer类的其他!林要求在app_start的bootrapper这我不知道它的正确

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 

      Bootstrapper.Initialise(); 
     } 

我也有,这可能涉及到路由的感觉,其实我加入了经典的MVC路由的配置,因为我读到的WebAPI和MVC使用不同的“激活剂”的东西或somehing像

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

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

和错误是...? – abatishchev

+1

并删除所有不直接相关的代码,使问题更加清楚,请。 – abatishchev

+0

//这将引发“似乎并没有实现Microsoft.Practices.ServiceLocation.IServiceLocator ....错误” – lincx

回答

5

找到了答案,好像博客已经过时,因为我不甚至有创建IoCContainer,因为我只需要安装Unity.WebAPI,只是设置DependencyResolvernew Unity.WebApi.UnityDependencyResolver(container);

public static class Bootstrapper 
    { 
    public static IUnityContainer Initialise() 
    { 
     var container = BuildUnityContainer(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); 

     return container; 
    } 

信用:http://netmvc.blogspot.com/2012/04/dependency-injection-in-aspnet-mvc-4.html

+1

也值得一从Unity团队:ASP.NET MVC的团结引导程序(HTTP ://nuget.org/packages/Unity.Mvc/)和[为的ASP.NET Web API统一引导程序(http://nuget.org/packages/Unity.AspNet.WebApi/)。 –

+0

因此,是可以接受你的控制器使用GlobalConfiguration.Configuration.DependencyResolver? –