- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,让我们看看微软对 Asp.Net Core 的默认依赖注入(inject)服务是怎么说的:
The framework takes on the responsibility of creating an instance of the dependency and disposing of it when it's no longer needed.
即该框架将调用一个类 Dispose 方法(假设该类实现了 IDisposable)
其次,DbContext 类确实实现了开箱即用的 IDisposable。
第三,在我们的 Startup.cs 类中,我们通过 AddDbContext 方法添加我们的 DbContext,默认情况下它被添加为 Scoped 实例(即我们的 DbContext 是在每个请求上创建和垃圾收集的).
Scoped lifetime services are created once per request.
例如
public void ConfigureServices(IServiceCollection services)
{
services
.AddDbContext<TheStoreDbContext>(ConfigureDbContext)
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
}
结论,我们不需要在我们的 Asp.net Core 应用程序中的任何地方显式调用 context.Dispose()。
那么,为什么网上和教程中有那么多示例向您展示必须在 Repository 或 UnitOfWork 类中实现 IDisposable?
例如
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _context;
public IProductRepository ProductRepository { get; }
public UnitOfWork(DbContext context)
{
_context = context;
ProductRepository = new ProductRepository(context);
}
public void Dispose()
{
_context.Dispose();
}
}
你怎么看?这是一个有效的问题吗?不在任何地方显式调用 Dispose() 方法是否有意义?
最佳答案
根据经验,一个类应该只处理它拥有的。但是,对于 UnitOfWork
,它不拥有 DbContext
,因为它不是由 UnitOfWork
创建的>——而是由其他人从外部提供。
让 UnitOfWork
处理那个 DbContext
甚至会产生问题,因为 UnitOfWork
无法知道 DbContext
在处理 UnitOfWork
时仍由系统中的其他类使用。换句话说,当 UnitOfWork
开始处理该依赖项时,应用程序可能会中断。
因此,如果您遵循仅处置您拥有的的规则,这意味着 UnitOfWork
实际上应该 不 实现 IDisposable
完全没有。这意味着您让“其他人”控制 DbContext
的生命周期。
这种将依赖项(例如 DbContext
)的生命周期控制权移交给第三方的想法并不是什么新鲜事,当然也不是新的 Microsoft DI 容器所特有的。这其实是一个古老的想法,就是你把对应用程序组件生命周期的控制权集中在应用程序的启动路径上。在 DI 的上下文中,此启动路径通常称为 Composition Root .
在 Composition Root 中,Composer 的工作是创建应用程序组件,管理它们的生命周期,并在不再需要它们时处理它们。 DI 容器(如 .NET Core DI 容器)充当系统中的 Composer,但您也可以手动执行此操作——通常称为 Pure DI 的做法.
另见 this answer ,其中还谈到了在 SOLID 原则的背景下进行处置。
关于c# - 我们真的需要在 Repository 或 UnitOfWork 类中实现 IDisposable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417593/
我关注了this tutorial . 我已经到了使用 _unitOfWork.XYZRepository.Get() 调用存储库的阶段,现在更进一步,我想为我的 UnitOfWork 类编写一个接口
我的业务对象存储在两个数据存储中。对象的一部分存储在 Azure 表存储中,另一部分存储在 Azure SQL 中。基本上 SQL 部分用于查询,而表存储用于占用大量空间的属性。 大多数时候,只使用对
显然(而且很有可能)我当前的 UnitOfWork 实现存在缺陷,因为我在同时进行多个调用时出现连接错误。 异常: The underlying provider failed on Open. 内部
我目前已经做了一个 UnitOfWork 实现,它包装了数据库连接和事务。 using (var uow = UnitOfWorkFactory.Create()) { // do db op
在 DDD 模式中,工作单元应该与存储库耦合吗?我见过几个不同的例子,包括一个实现工作单元接口(interface)的存储库,一个实现工作单元本身行为的存储库,以及一个具有代表工作单元的属性的存储库,
我有一个像这样的特定和通用存储库: 通用存储库: public class Repository : IRepository where TEntity : class { protected
我正在使用以下 UnitOfWork 类,以便通过使用泛型为我的实体获取存储库。 public class UnitOfWork : IUnitOfWork { private readonly
我认为这是一个常见问题,但经过一番搜索后我找不到任何相关内容。 我遇到的问题是,当使用 @UnitOfWork 注释我的资源方法并在我的资源方法内部时,我得到了一个 No Hibernate Sess
我正在为我们需要构建的小型应用构建单元测试。 我已经实现了存储库/工作单元模式。我的经理类实现了工作单元模式。 对于给定的接口(interface): public interface IUserMa
对 FluentNHibernate 很陌生,但我也对这个领域感到兴奋。我最近开始使用上述方法开发新的 DAL,并且一直在阅读存储库模式。我喜欢此模式采用的通用形式,并希望将此模式与 UnitOfWo
我有以下类(class): public FooDAO extends AbstractDAO { // Dropwizard DAO @Inject FooDAO(SessionFactory
我有这些类(class): public static class UnitOfWorkSS { public static IUnitOfWork Begin() { return
我正在尝试实现一个通用的存储库模式。我找到了这个网站,我认为它解释得很好。 http://www.tugberkugurlu.com/archive/generic-repository-patter
如果我实现一些简单的 OR/M 工具,我应该把恒等映射放在哪里?显然,每个 Repository 都应该有权访问自己的标识映射,以便它可以注册加载的对象(或者 DataMapper 是在 Identi
互联网上到处都是关于UnitOfWork的信息图案;甚至 SO 也不异常(exception)。 我还是不明白。据我了解 UnitOfWork = Transaction in DB .仅此而已;不多
我已经实现了我的 UnitOfWork,以便它保留对所有存储库的引用。 public interface IUnitOfWork { void Commit(); void RollBac
当使用 Rhino Commons UnitOfWork(在 ASP-MVC 的 UnitOfWorkApplication 中)时,我喜欢使用 Rhino Repository 静态类来保存这样的实
我有一个 Doctrine 事件监听器,用于监听 onFlush 事件。我使用它在保存时更新实体上的电子标签。 我需要访问计划删除的实体,以便我可以访问它们的关联对象,但是: 我使用的是软删除过滤器,
我在网上看到了很多关于 UnitOfWork 和 Repo 模式的信息,但仍然不清楚为什么以及何时使用——这让我有些困惑。 考虑到我可以通过使用 DI 通过使用 IoC 来测试我的存储库,如本文 Wh
我在后台任务方法(由 Quartz 操作)中使用 UnitOfWork,在 hibernate 之上使用 Guice-persist。后台任务调用一个服务,它需要在它的任务中间提交当前事务——然后继续
我是一名优秀的程序员,十分优秀!