我是autofac和存储库的新手。我下载了一个MVC示例项目,正在研究中。
我有一个数据库和几个相关的表。MVC控制器中有一个客户回购服务。
我在客户类别中有几个属性类别。
我要添加新记录。但是我还需要将记录添加到嵌套类中。
将一个客户服务添加到构造方法的参数中。
如何访问控制器中的其他表。
什么是最好的方法。
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)
致电您的服务>
如果要学习更新数据库表的更高级方法,请查看transaction contexts。它们将使您可以逐个操作数据库并仍然保持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();
}