をプレゼンテーション層からCustomer
エンティティの使用を抽象化への道を非表示にすることではありませんエンティティ自体はある種のICustomer
の背後にあり、DIコンテナにそれを構築させることもできません。インタフェースの背後にあるデータオブジェクトを隠すことは、一般的には有用ではありません。インタフェースとは、データではなく、抽象的な動作を意味します。 NightOwlすでにstatedとして
、あなたのCustomer
エンティティは、ランタイムデータであり、あなたがは、ランタイムデータを含むオブジェクトグラフを構築するための容器を使用しないでください。
代わりに、抽象化の背後にある特定のビジネス操作を非表示にする必要があります。そのような抽象化は、プレゼンテーション層によって消費され、ビジネス層によって実装されることができる。例えば:
public interface ICustomerServices
{
void CreateCustomer(string customerName, string homeAddress,
string shippingAddress);
void ChangeShippingAddress(Guid customerId, string shippingAddress);
}
あなたのコントローラは、この抽象化に依存することができます
private readonly ICustomerServices customerServices;
public CustomerController(ICustomerServices customerServices) {
this.customerServices = customerServices;
}
public ActionResult Index()
{
this.customerServices.CreateCustomer("Sam", "xyz", "xyz xyz xyz");
}
今すぐあなたのビジネス層が内部エンティティを使用して、この抽象化のための実装を作成することができます
public class CustomerServices : ICustomerServices
{
private readonly EntitiesContext context;
public CustomerServices(EntitiesContext context) {
this.context = context;
}
public void CreateCustomer(string customerName, string homeAddress,
string shippingAddress)
{
// NOTE that I renamed 'Customers' to 'Customer', since it holds information
// to only one customer. 'Customers' implies a collection.
Customer cust = new ShopEntities.Customer();
cust.CustName = "Sam";
cust.IAddress = "xyz";
cust.ShippingAddress = "xyz xyx xyz";
this.context.Customers.Add(cust);
this.context.SubmitChanges();
}
public void ChangeShippingAddress(...) { ... }
}
行う
これは、プレゼンテーションレイヤーを薄く保つことができるという利点がありますが、代替案と比較して、示されたアプローチにはかなりの面があります。このような代替案の1つは、hereのように、SOLID設計のメッセージベースのアプローチを使用することです。
[Dependency-injection anti-pattern:コンポーネントへのランタイムデータの注入](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)エンティティのインタフェースを作成したりDIを使用したりしないでください。これらは実行時データです。 DIはアプリケーションコンポーネントを構成するためのものです。 – NightOwl888