【问题标题】:OWIN and Global.asax.cs fileOWIN 和 Global.asax.cs 文件
【发布时间】:2015-07-22 06:42:44
【问题描述】:

我在我的项目中使用 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);

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

类型异常 “Bootstrap.Extensions.Containers.NoContainerException”发生在 Bootstrapper.dll 但未在用户代码中处理

附加信息:无法继续。容器没有被 初始化。

如果我调用某人的 api 方法,我会捕获下一个异常:

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

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

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

来源错误:

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

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

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

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

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

而且我有为 API 编写逻辑的服务。

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

 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);
        }
....

【问题讨论】:

  • 您使用的是哪种 IoC 容器?
  • @Kamo 我更新了我的问题
  • Bootstrapper.Container as Container不是给你null吗?
  • @Kamo 我在第一行发现异常 Bootstrapper.IncludingOnly.Assembly(Assembly.Load("Dashboard.Rest")).With.SimpleInjector().With.ServiceLocator().Start();
  • 您正在使用某种引导库。您展示的代码不是 Simple Injector API 的一部分。您使用的是哪个引导库?

标签: c# asp.net owin global-asax simple-injector


【解决方案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();
    }
}

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.
}

一些使用 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

【讨论】:

  • 所以基本上你的解决方案是停止使用 Bootstrapper 库?
  • @Steven 刚才 - 是的。 :)
猜你喜欢
  • 2011-09-11
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2015-01-25
相关资源
最近更新 更多