C# IoC Unity:为依赖项注入注册实体框架ObjectContext

C# IoC Unity:为依赖项注入注册实体框架ObjectContext,c#,.net,entity-framework,dependency-injection,C#,.net,Entity Framework,Dependency Injection,使用Unity注册EF ObjectContext进行注入的最佳方法是什么 我试过这个: var environment = new EnvironmentInformationProvider(); container.RegisterType<MyContext>(new MyContext(environment.ConnectionString)); 我不知道如何解决这个问题。。。另外,我不认为这会设置实例生命周期 因此,通过一些挖掘,我发现: builder.Regist

使用Unity注册EF ObjectContext进行注入的最佳方法是什么

我试过这个:

var environment = new EnvironmentInformationProvider();
container.RegisterType<MyContext>(new MyContext(environment.ConnectionString));
我不知道如何解决这个问题。。。另外,我不认为这会设置实例生命周期

因此,通过一些挖掘,我发现:

builder.RegisterType<MyContext>()
                  .As<IMyContext>()
                  .InstancePerLifetimeScope();
builder.RegisterType()
.As()
.InstancePerLifetimeScope();
这是自动传真代码。切换到它不是一个选项,因为我正在处理一个现有的应用程序(Unity也应该能够这样做)

假设以上是我需要的,Unity的等价物是什么?

注册类型时,您不应该传递该类型的实例,而是(可选)一些数据,这些数据将有助于Unity根据请求实例化该类型(在您的情况下是连接字符串):

container.RegisterType(新注入构造函数(environment.ConnectionString));
您尝试自己实例化并注册上下文时,可能使用以下方法进行编译:

container.RegisterInstance(新的MyContext(environment.ConnectionString));

但这会导致您的上下文像单例一样有效地运行,而在实体框架上下文的情况下,这是一种已知的反模式,会给您带来很多麻烦。

如何从MyContext提取接口?(MyContext是我的EF ObjectContext)如果“extract”是指“resolve”,则可以执行
container.resolve()
,这将生成并返回注册的类型。但是您最好使用依赖注入。你知道为什么要首先使用IoC吗?不,我的意思是提取:)我的意思是,我的MyContext继承自ObjectContext,但没有接口(这是从DB生成的标准EF实现)。所以,我不知道我会有什么接口可以映射到MyContext。大多数人之所以费心创建一个接口来访问他们的数据层,是为了抽象出对EF的硬依赖(通常是为了方便测试依赖类型),如果你不知道要定义什么接口,也许您根本不需要抽象EF,最终可以使用
container.RegisterType
,或者根本不使用IoC。然而,大多数人倾向于选择使用存储库模式进行抽象。我认为在较早版本的
Unity.Mvc
NuGet包中,由于某种原因,它丢失了。首先尝试安装Unity.Mvc5,如果仍然缺少它,请使用第二个链接中的代码手动添加它。
builder.RegisterType<MyContext>()
                  .As<IMyContext>()
                  .InstancePerLifetimeScope();
container.RegisterType<IMyContext, MyContext>(new InjectionConstructor(environment.ConnectionString));
container.RegisterInstance<IMyContext>(new MyContext(environment.ConnectionString));