OWIN和Global.asax.cs文件

Tar*_*nko 5 c# asp.net global-asax simple-injector owin

我在我的项目Owin和Katana中使用OAuth授权.并且所有工作都很好但在global.asax.cs文件中我有一些IOC容器的代码:

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

我在Startup.cs文件中添加了这段代码,但之后我抓住了下一个异常:

Bootstrapper.dll中出现"Bootstrap.Extensions.Containers.NoContainerException"类型的异常,但未在用户代码中处理

其他信息:无法继续.容器尚未初始化.

如果我调用某人api方法,我会抓住下一个异常:

无法继续.容器尚未初始化.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:Bootstrap.Extensions.Containers.NoContainerException:无法继续.容器尚未初始化.

来源错误:

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

我不知道如何解决它.请帮帮我.谢谢.

更新 我有一些SimpleInjectorRegisterTypes类用于连接我的接口和服务:

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

            container.RegisterSingle<IApplication, ApplicationService>();      
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在为API编写逻辑的地方提供服务.

在我的控制器中,我使用帮助接口创建用于调用my方法的构造函数:

 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);
        }
....
Run Code Online (Sandbox Code Playgroud)

Tar*_*nko 1

我解决这个问题。我只是使用其他IOC容器Unity

下面是包装 Unity 容器的 IDependencyResolver 的实现。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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.
}
Run Code Online (Sandbox Code Playgroud)

一些使用 IoC 容器的控制器:

public class ProductsController : ApiController
{
    private IProductRepository _repository;

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

    // Other controller methods not shown.
} 
Run Code Online (Sandbox Code Playgroud)

ASP.NET Web API 2 中的依赖注入