c# - Autofac 通用存储库服务多个 DBSet
问题描述
我是 Autofac 和存储库的新手。我下载了一个 MVC 示例项目,我正在研究它。我有一个数据库和几个相互关联的表。MVC 中有一个Customer
repo 服务Controller
。
我在客户类中有几个属性类。
我想添加一条新记录。但我还需要向嵌套类添加记录。在构造方法的参数中添加了一项客户服务。
如何访问控制器中的其他表。
什么是最好的方法。
private readonly IService<SubCustomer> _serviceSubCust;
private readonly IService<Customer> _serviceCust;
private readonly IService<Document> _serviceDoc;
private readonly int _pageSize;
public DocumentTransactionController(
IService<SubCustomer> serviceSubCust,
IService<Customer> serviceCust,
IService<Document> serviceDoc)
{
_serviceCust = serviceCust;
_serviceSubCust = serviceSubCust;
_serviceDoc = serviceDoc;
_pageSize = 10;
}
解决方案
假设所有服务都在你的 startup.cs 中注册,从数据访问和简单的数据写入开始。您没有发布您的服务方法,所以我要对其中的内容进行黑匣子测试。
也许您的内部有一个_serviceCust
公开您的客户列表的方法,或者它有各种方法,例如GetCustomerList()
、 或CreateCustomer(Customer cust)
。服务的神奇之处在于您可以存储可重用逻辑并从控制器访问它。在这种情况下,服务的最佳用途是可以为您更新数据库中的嵌套结构的方法。
如果你想创建一个客户,从你的控制器开始
var bobCustomer= new Customer()
{
Name = "Bob",
Profession = "Builder",
Document = docObject, //you need a prepared document object here
};
然后你会调用你的服务使用_serviceCust.CreateCustomer(bobCustomer)
如果您想了解更新数据库表的更高级方法,请查看事务上下文。它们将允许您逐个操作您的数据库并仍然保持 ACIDity。
但是,如果您必须在控制器中包含逻辑,则可以执行以下伪代码
using(var ctx = new ContextTransaction()){
var customer = new Customer();//...create customer object...
_serviceCust.Update(customer);
ctx.SaveChanges();
var sub = new SubCustomer();
sub.ParentCustomer = customer.Id; //use the customer id as a foreign key for your subcustomer
_serviceSubCust.Update(sub);
ctx.SaveChanges();
//use the subcustomer id as a foreign key for your other nested classes, so on so forth...
ctx.Commit();
}
推荐阅读
- r - 在 data.table 计算中引用之前的值
- ms-access-2007 - 非常基本的问题关于多对多查询 MS-Access
- r - 用平均值和 SD 绘制 R 中的纵向数据
- javascript - 为什么我应该在 Typescript 中使用接口
- php - 从 PHP PDO 调用 SQL 存储过程
- android - 后台服务暂停并在 OREO 上自动重新启动
- spring-boot - MSIS0037:未找到颁发者的签名验证证书
- libgdx - 使用 setBounds 调整 Sprite 大小后如何旋转 Sprite?(LIBGDX)
- python - 反向传播成本函数误差增加而不是减少
- powershell - 使用 powershell 重命名目录中具有给定名称的所有文件夹