私は現在、データ アクセス レイヤーとして Code First を使用して、ASP .NET MVC 3 Web アプリケーションをプロトタイプとして開発しています。今、私は自分のコードをどこに置くべきか少し混乱しています。
クラス Customer とクラス プロジェクトがあります。プロジェクトには、顧客へのナビゲーション プロパティがあります。
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; }
}
これら 2 つのクラスを使用して、codefirst によるデータ アクセスを行います。
public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Project> Projects { get; set; }
}
これらのデータ アクセス クラスを MVC ビューで直接使用しないことがベスト プラクティスであることを学びました。そのため、単一の Customer 用に 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();
}
...しかし、データにアクセスできる場所が 2 つあります。サービス クラスと顧客クラスです。
このコードを 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);
}
}
説明されているすべてのアプローチが機能し、正しい結果が得られます-しかし、私は正しい方法でそれを行いたいです-どのようにそれを行いますか-または私は完全に軌道から外れています;-)?
ありがとうございました!