gpt4 book ai didi

.net - Unity框架-在适当的时候创建和处置 Entity Framework dbcontext

转载 作者:行者123 更新时间:2023-12-02 12:01:17 25 4
gpt4 key购买 nike

在 StackOverflow 的帮助下,我使用 Unity Framework 创建了链式依赖项,包括 Entity Framework 数据上下文对象:

using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<IMeterView, Meter>();
container.RegisterType<IUnitOfWork, CommunergySQLiteEntities>(new ContainerControlledLifetimeManager());
container.RegisterType<IRepositoryFactory, SQLiteRepositoryFactory>();
container.RegisterType<IRepositoryFactory, WCFRepositoryFactory>("Uploader");
container.Configure<InjectedMembers>()
.ConfigureInjectionFor<CommunergySQLiteEntities>(
new InjectionConstructor(connectionString));

MeterPresenter meterPresenter = container.Resolve<MeterPresenter>();

这在创建我的 Presenter 对象和显示相关 View 方面非常有效,我真的很高兴。

但是,我现在遇到的问题是 Entity Framework 对象的创建和处置的时间安排(我怀疑这适用于任何 IDisposable 对象)。像这样使用 Unity,可以立即创建 SQL EF 对象“CommunergySQLiteEntities”,因为我已将其接口(interface) IUnitOfWork 添加到 MeterPresenter 的构造函数

    public MeterPresenter(IMeterView view, IUnitOfWork unitOfWork, IRepositoryFactory cacheRepository)
{
this.mView = view;
this.unitOfWork = unitOfWork;
this.cacheRepository = cacheRepository;
this.Initialize();
}

当时我对此感到有点不安,因为我不想保持数据库连接打开状态,但我看不到使用 Unity 依赖注入(inject)的任何其他方法。果然,当我实际尝试使用 datacontext 时,我收到此错误:

    ((System.Data.Objects.ObjectContext)(unitOfWork)).Connection 
'((System.Data.Objects.ObjectContext)(unitOfWork)).Connection'
threw an exception of type 'System.ObjectDisposedException'
System.Data.Common.DbConnection {System.ObjectDisposedException}

我对 IoC 原理的理解是,你在顶部设置所有依赖项,解析你的对象,然后就可以走了。但是,在这种情况下,某些子对象(例如数据上下文)不需要在创建父 Presenter 对象时进行初始化(就像您将它们传递到构造函数中一样),但 Presenter 确实需要了解当 IUnitOfWork 想要与数据库对话时使用什么类型。

理想情况下,我希望在我已解析的 Presenter 中出现类似的内容:

using(IUnitOfWork unitOfWork = new NewInstanceInjectedUnitOfWorkType())
{
//do unitOfWork stuff
}

因此,Presenter 知道要使用什么 IUnitOfWork 实现来立即创建和处置,最好是从原始的 RegisterType 调用中知道。我是否必须在 Presenter 中放置另一个 Unity 容器,从而冒着创建新依赖项的风险?

对于 IoC 专家来说,这可能是非常明显的,但我真的很感谢您指出正确的方向。

最佳答案

您无需担心在创建演示者的同时初始化 ObjectContext - ObjectContext 不会保持打开的数据库连接。相反,当它实际需要与数据库通信时,即当您执行查询或提交更改时,它会根据需要打开连接,并在完成后立即关闭连接。仅当您显式打开连接时,它才会保持连接打开,这在 Entity Framework 中很少见。

如果您使用 ContainerControlledLifetimeManager 收到 ObjectDisposeException 异常,则意味着您的容器在演示者之前被释放,这是一个设计错误。目前尚不完全清楚您的环境是什么(ASP.NET?Winforms?),但是 ContainerControlledLifetimeManager 可能不适合这里,因为它作为 Singleton 实例工作。通常,当您解析类型时,您实际上会想要创建一个新的上下文实例 - 如果您使用单例,则会遇到许多问题。

所以 - 我会在这里摆脱 ContainerControlledLifetimeManager ,并确保您的容器不会过早被处置;事实上,它位于 using block 中,这表明这可能是导致 ObjectDisposeException 的原因。 (当然,您最终仍然需要处置容器 - 只是您可能正在做一些类似创建无模式表单之类的事情,该表单在控制离开 using 范围后仍保持事件状态很长时间)。

关于.net - Unity框架-在适当的时候创建和处置 Entity Framework dbcontext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2436823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com