我正在使用简单的注射器。
我有一个也有ApiControllers的mvc项目。
这是我的设置:
public static class SimpleInjectorWebApiInitializer
{
/// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
InitializeContainer(container);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
// This is an extension method from the integration package.
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
// GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
}
private static void InitializeContainer(Container container)
{
container.Register<DbContext, CoreContext>(Lifestyle.Scoped);
container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
}
}
但是这给了我错误:
配置无效。以下诊断警告是 报告: -[生活方式不匹配] UnitOfWork(异步作用域)取决于CoreContext(瞬态)。
答案 0 :(得分:1)
您的UnitOfWork
类依赖于CoreContext
,但是您没有将CoreContext
注册为服务,而只是注册为实现。 Simple Injector将仅查找服务注册,但缺少CoreContext
的注册。作为后备,Simple Injector将尝试直接解析CoreContext
,这是可行的,因为它是具体类型。但是,这些未注册的具体类型默认情况下会使用Transient生活方式解决。
但是,通常不需要将DbContext实现解析为Transient。范围通常更好,因此简单注入器在警告此方面是正确的。
您应该将注册更改为以下内容:
container.Register<CoreContext>(Lifestyle.Scoped);
container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);