2015-11-05 130 views
1

使用Unity注册注入EF ObjectContext的最佳方式是什么?IoC Unity:为依赖注入注册实体框架ObjectContext

我尝试这样做:

var environment = new EnvironmentInformationProvider(); 
container.RegisterType<MyContext>(new MyContext(environment.ConnectionString)); 

但导致这个错误:

Error CS1503 Argument 2: cannot convert from 'MyContext' to 
'Microsoft.Practices.Unity.InjectionMember' 

而且我不知道如何解决......另外,我不认为设立实例生存期。

所以,用一些挖我发现这一点:

builder.RegisterType<MyContext>() 
        .As<IMyContext>() 
        .InstancePerLifetimeScope(); 

也就是说Autofac代码。切换到它不是一种选择,因为我正在开发一个现有的应用程序(Unity应该能够做到这一点)。

假设以上是我所需要的,什么是Unity等值?

回答

3

当注册类型,你不应该传递一个实例类型但(可选)的一些数据,这将有助于团结实例在请求类型(连接字符串在您的情况) :

container.RegisterType<IMyContext, MyContext>(new InjectionConstructor(environment.ConnectionString)); 

你试图实例上下文自己和注册,本来是使用编译

container.RegisterInstance<IMyContext>(new MyContext(environment.ConnectionString)); 

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

+0

如何从MyContext中提取接口? (MyContext是我的EF ObjectContext) – Spikee

+0

如果通过“提取”你的意思是“解决”,你可以做'container.Resolve ()',那将构建并返回注册类型。但是你最好用依赖注入来代替。你知道你为什么首先使用IoC吗? – haim770

+0

不,我的意思是逐字提取:)我的意思是,我的MyContext继承自ObjectContext,但没有接口(这是从DB生成的标准EF实现)。所以,我不知道我有什么接口可以映射到MyContext。 – Spikee