gpt4 book ai didi

c# - 如何在不使用存储库的情况下共享 EntityFramework 6 数据上下文?

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:07 25 4
gpt4 key购买 nike

由于 EF6 现在是完全可模拟的,并且我们拥有内置的工作单元和存储库 - 我想摆脱存储库模式。

但是,如何在应用程序中共享单个数据上下文。我应该有一个在其构造函数中采用数据上下文的基本服务吗?

public class BaseService<T>:where T:class
{
public BaseService(DataContext myDataContext)
{
//....... code
}
}

然后有派生服务,如PersonService、OrderService等使用datacontext查询、更新和保存数据?

或者有更好的方法吗?

谢谢

最佳答案

However, how is one to share a single data context across an application. Should I have a base service which takes a datacontext in its constructor?

像大多数事情一样,这取决于情况。您的设计有多复杂?你在应用领域驱动设计吗?代码优先还是数据库优先?

一般来说,您提出的解决方案是可以的。随着您的项目变得越来越复杂,您可能会采用 BoundedContexts作为应用领域驱动设计的一部分。因此,只有一个上下文是某些“BaseService”的一部分可能不再有意义。

JotaBe提到了依赖注入(inject)和上下文的生命周期,这很重要。你在使用依赖注入(inject)吗?我更喜欢让我的 IoC 容器负责上下文的生命周期。例如,对于 Web 应用程序,我会将生命周期绑定(bind)到每个 Web 请求。

任何成熟的IoC容器都应该能够支持这个。这是 Autofac 的快速单行代码。

builder.RegisterType<MyDbContext>().As<IMyDbContext>().InstancePerApiRequest();

特别是对于 Db-first 实现,我更喜欢使用接口(interface)支持 DbContext 并使用接口(interface)来控制向调用者公开的内容。

public interface IMyDbContext {
//Only expose people, not orders for example
DbSet<Person> People { get; set; }
}

public partial class MyDbContext : IMyDbContext {
//the generated DbContext class satisfies the interface
}

public class PersonService {

private readonly IMyDbContext _context;

public PersonService(IMyDbContext context){
_context = context;
}
}

我发现开销很小,有助于将上下文范围限定到您感兴趣的实际对象,而不是创建多个 EDMX 文件。当您的领域变得越来越复杂时,帮助引入 BoundedContexts。

这是另一个 example关于有界上下文和缩小 EF 模型

关于c# - 如何在不使用存储库的情况下共享 EntityFramework 6 数据上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128033/

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