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)
我解决这个问题。我只是使用其他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)