2015-07-22 33 views
5

Używam w moim projekcie Owin i Katana do autoryzacji OAuth. I wszystko działa dobrze, ale w pliku Global.asax.cs Mam kod kontenera IOC:OWIN i Global.asax.cs file

Bootstrapper.IncludingOnly.Assembly(Assembly.Load("Dashboard.Rest")).With.SimpleInjector().With.ServiceLocator().Start(); 
      Container container = Bootstrapper.Container as Container; 
      GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 

dodałem ten kod w Startup.cs pliku, ale po nim złapię następny wyjątek:

An exception of type 'Bootstrap.Extensions.Containers.NoContainerException' occurred in Bootstrapper.dll but was not handled in user code

Additional information: Unable to continue. The container has not been initialized.

i gdybym kogoś zadzwonić metod api złapię następny wyjątek:

Unable to continue. The container has not been initialized.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: Bootstrap.Extensions.Containers.NoContainerException: Unable to continue. The container has not been initialized.

Source Error:

Line 21: public Startup() Line 22: { Line 23:
Bootstrapper.IncludingOnly.Assembly(Assembly.Load("Dashboard.Rest")).With.SimpleInjector().With.ServiceLocator().Start(); Line 24: Container container = Bootstrapper.Container as Container; Line 25:
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

nie wiem jak to naprawić. Pomóż mi proszę. Dzięki.

UPDATE Mam kilka SimpleInjectorRegisterTypes klasę dla połączyć moje interfejsów i usług:

public class SimpleInjectorRegisterTypes : ISimpleInjectorRegistration 
    { 
     public void Register(Container container) 

      container.RegisterSingle<IApplication, ApplicationService>();  
     } 
    } 

I mam usługę gdzie piszę logiki dla API.

I w moich kontrolerami utworzyć konstruktor wywołać moja metoda z interfejsami Pomoc:

public class ApplicationController : ApiController 
    { 
     private readonly IApplication _application; 

     public ApplicationController(IApplication application) 
     { 
      _application = application; 
     } 

     [HttpGet] 
     public IHttpActionResult GetAllApps() 
     { 
      var apps = _application.GetAllApps(); 
      return apps == null ? (IHttpActionResult)Ok(new Application()) : Ok(apps); 
     } 
.... 
+0

Jaki rodzaj kontenera IoC używasz? – Kamo

+0

@Kamo zaktualizowałem moje pytanie –

+0

Czy nie jest wiersz 'Bootstrapper.Container jako Container', który daje' null'? – Kamo

Odpowiedz

1

naprawić ten problem. Po prostu używam innego kontenera IOC Unity

Oto implementacja IDependencyResolver, która otacza kontener Unity.

public class UnityResolver : IDependencyResolver 
{ 
    protected IUnityContainer container; 

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

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return container.Resolve(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return container.ResolveAll(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return new List<object>(); 
     } 
    } 

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

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

WebApiConfig.cs

public static void Register(HttpConfiguration config) 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<IProductRepository, ProductRepository>(new HierarchicalLifetimeManager()); 
    config.DependencyResolver = new UnityResolver(container); 

    // Other Web API configuration not shown. 
} 

Niektóre kontrolery z wykorzystaniem kontenerów IoC:

public class ProductsController : ApiController 
{ 
    private IProductRepository _repository; 

    public ProductsController(IProductRepository repository) 
    { 
     _repository = repository; 
    } 

    // Other controller methods not shown. 
} 

Dependency Injection in ASP.NET Web API 2

+0

Twoje rozwiązanie polega na tym, aby przerwać korzystanie z biblioteki Bootstrapper? – Steven

+0

@Steven właśnie teraz - tak. :) –