工作单元中的多个通用存储库?

2023-12-08

假设我有 2 张桌子。ProductCategory and Product。我有 1 个可以处理两个表的通用存储库:

public class GenericRepository<T> : IRepository<T>

但是,当使用工作单元模式时,我是否被迫为数据库中的所有表创建存储库?

public interface IUnitOfWork : IDisposable
{
    int SaveChanges();

    IRepository<ProductCategory> ProductCategoryRepository { get; }
    IRepository<Product> ProductRepository { get; }
}

有没有办法可以将通用存储库添加到工作单元类中?


您可以向 IUnitOfWork 接口添加通用方法:

public interface IUnitOfWork : IDisposable
{
    int SaveChanges();

    IRepository<T> Repository<T>();
}

但我不推荐它。这听起来像是服务定位器反模式和 SRP 违规。更好的方法是从 IUnitOfWork 接口中删除所有存储库,因为提供对存储库的访问不是 UnitOfWork 的责任。我建议将存储库与 UnitOfWork 分开,并自行将其注入消费者中。

public class Consumer
{
    private readonly IUnitOfWork _unitOfWork;
    private readonly IRepository<Product> _products;

    public Consumer(IUnitOfWork unitOfWork, IRepository<Product> products)
    {
        _unitOfWork = unitOfWork;
        _products = products;
    }

    public void Action()
    {
        var product = _products.GetOne();

        product.Name = "new name";
        _products.Update(product);

        _unitOfWork.SaveChanges();
    }
}

UDATE:

UnitOfWork 和 Repository 可以共享上下文实例。 这里是代码示例:

public class EfUnitOfWork : IUnitOfWork
{
    private readonly DbContext _context;

    public EfUnitOfWork(DbContext context)
    {
        _context = context;
    }

    public void SaveChanges()
    {
        _context.SaveChanges();
    }
}

public class EfRepository<T> : IRepository<T> where T : class
{
    private readonly DbContext _context;

    public EfRepository(DbContext context)
    {
        _context = context;
    }

    //... repository methods...
}

public class Program
{
    public static void Main()
    {
        //poor man's dependency injection
        var connectionString = "northwind";

        var context = new DbContext(connectionString);
        var unitOfWork = new EfUnitOfWork(context);
        var repository = new EfRepository<Product>(context);
        var consumer = new Consumer(unitOfWork, repository);
        consumer.Action();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

工作单元中的多个通用存储库? 的相关文章

  • VS 2012 中缺少实体数据模型

    添加新项目时 我在 数据 选项卡下找不到实体数据模型 我查看了几个问题和答案以及有关此问题的信息 但没有一个解决方案有效 我已修复 卸载并重新安装 手动安装 EF Tools 包并尝试卸载所有 VS 相关程序 我还尝试在不同的 NET 框架
  • JQuery - 使用 JSON 的属性创建输入

    我正在尝试使用 JSON 设置的 id 和 value 属性创建一个输入 我有一个获取 JSON 的 ajax 调用 返回的数据很好 对于 JSON 中的每个对象 我想创建一个带有 ID 和 JSON 值的按钮 阿贾克斯调用 ajax ty
  • 在ConfigureServices中注入依赖

    在我的 ASP Net Core 应用程序中 我需要在以下位置注入一些依赖项 在我的例子中是一个存储库 ConfigureServices method 问题是该方法不允许使用多个参数来注入依赖项 该怎么办呢 这是我的代码 public v
  • 使用 linq 2 实体检查 where 子句的两个条件

    嗨 我有一个名为 产品 的表 其中包含列 product id prodcut name prodcut price values like 1200 2000 3000 100 prodcut desc category id 1 2 3
  • 在 ASP.NET MVC 中强制使用 Json() 中的小写属性名称

    鉴于以下课程 public class Result public bool Success get set public string Message get set 我将在控制器操作中返回其中之一 如下所示 return Json ne
  • ASP.NET MVC 显示配置文件中的用户名

    以下是LogOn来自 Visual Studio 创建的标准默认 ASP NET MVC 项目的用户控件 登录用户控件 ascx Welcome b b
  • 从 .Net MVC 视图获取 HTML,而不在浏览器中实际渲染视图?

    我的控制器中有一个 ActionResult 我想从中发送 HTML 电子邮件 该电子邮件的正文是由视图生成的 我可以在传递模型时获取视图的结果并避免将其发送到浏览器 而不是在控制器中使用 2 个 actionresults 方法吗 Mvc
  • IIS 7 错误:无法执行程序。正在执行的命令是 csc.exe(ApplicationPoolIdentity 默认设置)

    这是我的第一个问题 如果我有一些语法错误 请向我道歉 问题描述 我在多台服务器上安装了运行在 IIS 7 Windows Server 2008 和 SQL Server 2008 R2 上的基于 32 位 MVC 5 的 CRUD 系统
  • 传入字典的模型项是类型

    我有一个我理解的错误 但无法找出以正确的方式解决的方法 我有一个 MasterPage 我从该 MasterPage 中调用 标签是一个强类型视图 如下所示 我像这样返回 PartialView return View Tags resul
  • 如何将 Orchard CMS 与当前的 MVC2 应用程序集成?

    对于我的项目 客户端有一个现有的 ASP NET MVC 2 Web 应用程序 该应用程序具有产品目录和购物车功能 客户正在重新设计他们的网站 并希望使用 Orchard 来维护他们的内容页面 例如主页 关于 服务等 他们希望尽可能多地使用
  • asp.net mvc 4 - 可以在每个线程共享 DbContext 吗?

    From 每个 Web 请求一个 DbContext 为什么 https stackoverflow com questions 10585478 one dbcontext per web request why 我的理解是 DbCont
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • asp.net mvc:将 RedirectToAction(string, object) 转换为 RedirectToAction(x => x.Detail(id))

    任何人都知道如何创建一个方法 我将把它放在扩展类中 该方法将仅使用表达式 无魔术字符串 与 mvc 的 RedirectToAction 执行相同的操作 所以不要写这样的东西 RedirectToAction Detail new Rout
  • 构建 ViewModel 的合适粒度是多少?

    我正在开发一个新项目 在看到以前项目的一些困难后 这些项目没有提供足够的视图与模型的分离 特别是使用 MVC 模型和视图开始有点相互渗透 我想使用 MVVM 我了解基本概念 并且很高兴开始使用它 然而 有一件事我有点忽略 ViewModel
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 从数据库和文件系统中删除文件

    我有一个表引用我们网络上共享位置中的文件 将文件路径存储在数据库中 我有一个按钮需要从数据库中删除记录并从文件系统中删除文件 foreach var report in reports string filePath report Repo
  • JQuery Mobile 与 MVC 的链接

    我正在使用 ASP NET MVC 3 和 Razor UI 设置 JQuery 移动网站 我正在生成我的链接 例如 a href See Group 2 a 假设我从 Home Index 访问它 我遇到的问题是 当我点击链接时 它会出现
  • 良好的 WiX 编辑器 [重复]

    这个问题在这里已经有答案了 我目前正在开发一个使用 WiX 创建 MSI 的项目 我过去在 Sourceforge 上使用 WiXEdit 来管理包含在 WiX 项目中的文件 因为它比直接操作 XML 稍微容易一些 但它仍然有点笨重 有谁知

随机推荐

  • 使用 Cartopy 合并国家/地区

    我正在使用以下代码制作一张瑞典 挪威和芬兰作为一个区域的地图 然而 我正在为此挣扎 我正在关注这个示例 Python Mapping in Matplotlib Cartopy Color One Country from shapely
  • 更改现有 Django 应用程序中主键的最佳方法是什么?

    我有一个处于测试模式的应用程序 这个应用程序的模型有一些带有显式primary key的类 因此 Django 使用这些字段并且不会自动创建 id class Something models Model name models CharF
  • 在 JScrollPane 中看不到组件

    我使用 JScrollPane 来保存大面积文本的 JTextArea 我直接将 TextArea 添加到 JFrame 中 效果很好 但我将它添加到滚动窗格并添加滚动窗格 我没有看到文本区域 这是我的 SSCCE public class
  • 在Linux上使用javah

    我有一个在 JNI 上使用的简单类 我需要将其导出到头文件 h 我读过我需要使用javah命令 通过转到src项目文件夹 然后输入 javah jni com main package NativeClass 在 Windows 上它工作正
  • 如何在谷歌云存储中存储同名文件

    我正在创建一个网站 其中有很多用户上传的图像文件 因此随着时间的推移 链接可能会在 Google 云存储上出现同名图像 即使一个用户也可以随着时间的推移上传同名图像 那么我该如何解决这个问题 您可以做的一件事是在上传时向文件名添加时间戳 e
  • Karaf - Kafka OSGI 捆绑包 - 生产者问题

    我正在尝试在 apache Karaf version 4 0 3 中为 Kafka 生产者创建一个简单的捆绑包 这是我的Java代码 Properties props new Properties props put bootstrap
  • SQLite 中的移动平均线

    我想计算 SQLite 表中数据的移动平均值 我在MySQL中找到了几种方法 但在SQLite中找不到有效的方法 在 SQL 中 我认为类似的事情应该可以做到 但是 我无法尝试 SELECT date value avg value OVE
  • 在MYSQL中使用hibernate注解设置默认值

    我在互联网上搜索过 看到了有关使用 mysql 中的 hibernate 注释在实体类中设置默认值的想法 并且我已经完成了将默认值设置为数据类型整数的列 如下所示 Column name COLUMN NAME insertable fal
  • Response.Redirect 使用 POST 而不是 Get?

    我们需要提交表单并保存一些数据 然后将用户重定向到异地页面 但在重定向中 我们需要使用 POST 来 提交 表单 而不是 GET 我希望有一种简单的方法可以实现这一点 但我开始认为没有 我想我现在必须创建一个简单的其他页面 其中只有我想要的
  • jQuery UI 自动完成奇怪的行为

    以下是我的代码 var availableTags ActionScript AppleScript Asp BASIC C C Clojure COBOL ColdFusion Erlang Fortran Groovy Haskell
  • 一页上有多个表单

    我的个人资料编辑页面上的图像上传表单不起作用 这两种形式必须分开 因为它们独立工作 图像上传脚本在提交个人资料编辑表单之前上传图像 我在一个单独的页面上测试了图像上传 这是该页面上唯一的内容并且它有效 所以我假设是另一种形式把事情搞砸了 这
  • SQL 检查位标志

    因此应用程序具有带有位标记的复选框 根据选择的复选框选项 应用程序会将其作为整数存储在数据库中 如何查询数据库中的 int 以检查特定位是否打开 关闭 Example Decimal Binary 16 00010000 208 11010
  • 如何在iOS上使用CSS溢出来获取滚动条

    开发一个 iPad 网站我尝试使用 CSS 属性overflow auto如果需要的话获取滚动条div 但即使两根手指滚动正常 我的设备也拒绝显示它们 我尝试过 overflow auto and overflow scroll 结果是一样
  • 文件 Uri 方案和相关文件

    假设 uri 的方案是 文件 还假设路径以 开头 示例路径是 bashrc Fulluri 看起来怎么样 file bashrc 对我来说似乎很奇怪 简而言之 文件 URL 的形式如下 file localhost absolute pat
  • AWS EC2 tomcat 权限被拒绝创建/写入文件

    我有一个在弹性beanstalk EC2上运行的tomcat 64 位 Amazon Linux 2015 09 v2 0 4 运行 Tomcat 8 Java 8 当网络应用程序想要创建新的目录 文件时 我遇到了麻烦 我在 catalin
  • Javascript RegExp 可以做到部分不区分大小写吗?

    我想知道 Javascript RegExp 是否能够在正则表达式本身中打开和关闭不区分大小写 我知道您可以为整个正则表达式设置修饰符 但这不是我要讨论的内容 例如 我的搜索字符串可能是 teXT To seArcH TOP SECRET
  • 不使用 WMI 查找 USB 驱动器的序列号

    在 C 中 如何在不使用 WMI 的情况下查找 USB 驱动器的序列号 Thanks 如果您可以使用 WMI 以下链接看起来是一个不错的起点 使用 C 获取易失性 USB 序列号 您可以实现 WMI 解决方案 因为这看起来是非常简单的代码并
  • Java中带时间戳的数字签名

    我在使用可信时间戳通过 Bouncy Castle 创建有效的 CMS 签名时遇到问题 签名创建效果很好 我想将签名包含到 PDF 文件中 签名有效 但是 在我将可信时间戳添加到签名的未签名属性表中后 签名仍然有效 但读者报告说签名包含嵌入
  • R中的实时自动递增ggplot

    这个线程回答如何在 R 中创建具有实时效果的增量图 我想做同样的事情ggplot2而不是 R 的碱基plot 直接从该链接中的答案复制 我尝试了这个 但它不起作用 n 1000 df data frame time 1 n y runif
  • 工作单元中的多个通用存储库?

    假设我有 2 张桌子 ProductCategory and Product 我有 1 个可以处理两个表的通用存储库 public class GenericRepository