我目前正在开发一个 ASP .NET MVC 3 Web 应用程序作为原型,其中 Code First 作为数据访问层。现在我有点困惑把我的代码放在哪里。
我有一个班级客户和一个班级项目。项目对其客户具有导航属性。
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Customer Customer { get; set; }
}
我使用这两个类通过 codefirst 进行数据访问。
public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Project> Projects { get; set; }
}
我了解到,最好不要直接在我的 MVC 视图中使用这些数据访问类 - 所以我为单个客户创建了一个 ViewModel (CustomerListModel) 和一个 DTO。
public class CustomerDto
{
public int Id { get; set; }
public string Name { get; set; }
public int ProjectCount { get; set; } <== this property is in question
}
public class CustomerListModel
{
public List<CustomerDto> Customers;
}
在我的控制器中,我从进行实际数据访问的(服务)类中获取客户。
public class CustomerService : IDisposable
{
private MyContext db;
public CustomerService()
{
db = new MyContext();
}
public IEnumerable<Customer> GetAllCustomers()
{
return db.Customers.ToList<Customer>();
}
}
在我的控制器中,我调用该方法来获取所有客户。
public ViewResult Index()
{
//Mapper.CreateMap<Customer, CustomerDto>();
var customerList = new List<CustomerDto>();
foreach (var customer in rep.GetAllCustomers())
{
var cust = new CustomerDto();
cust.Id = customer.Id;
cust.Name = customer.Name;
cust.Rate = customer.Rate;
==> cust.ProjectCount = customer.ProjectCount; <=====
customerList.Add(cust);
}
var viewModel = new CustomerListModel()
{
Customers = customerList //Mapper.Map<IEnumerable<Customer>, List<CustomerDto>>(rep.GetAllCustomers())
};
return View(viewModel);
}
我要问的是 - 例如将单个客户的 ProjectCount 放在哪里。我可以把它放在客户类
public int ProjectCount
{
var db = new MyContext();
return db.Projects.Where(x => x.Customer.Id == this.Id).Count();
}
...但是我将有两个可以访问数据的地方-服务类和客户类。
我也可以将此代码放在我的 ServiceClass 中:
public int GetProjectCount(Customer customer)
{
return db.Projects.Where(x => x.Customer.Id == customer.Id).Count();
}
...但后来我不得不从控制器调用它:
foreach (var customer in rep.GetAllCustomers())
{
var cust = new CustomerDto();
cust.Id = customer.Id;
cust.Name = customer.Name;
cust.Rate = customer.Rate;
cust.ProjectCount = rep.GetProjectCount(customer); <==
customerList.Add(cust);
}
...我也可以从客户类的吸气剂中从我的服务类中调用此方法。
public int ProjectCount
{
get
{
return new CustomerService().GetProjectCount(this);
}
}
所有描述的方法都有效并给了我正确的结果 -但我想以正确的方式做 - 你会怎么做 - 或者我完全偏离了轨道;-)?
谢谢!