Onion アーキテクチャとeShopOnContainersのような DDD によって実装したソリューションがあります。
しかし、これを行うには問題があるため、共有することにしました。例を挙げて説明しようと思います。あなたは私がIOrderRepositoryのようなinterface
名前を持っていると思いますIOrderRepository
public interface IOrderRepository : IRepository<Order>
{
Order Add(Order order); // first issue
Task<OrderDTO> GetAsync(int orderId); // second issue
}
創刊
OrderRepositoryAdd
のようなメソッドを実装しましたが、次のコードのようなメソッドに追加のパラメーターが必要です。Add
public Order Add(Order order, int par1, int par2)
{
// I need a DTO to persist order
OrderDTO orderDTO = new OrderDTO({Order = order, Par1 = par1, Par2 = par2 });
// Call a method with orderDTO parameter as a service to insert order
}
ご覧のとおりIOrderRepository
、追加のパラメーターが必要なため、実装は間違っています。
最初の問題の間違った解決策
この問題に取り組むには、2 つの間違った解決策があります。
1-調整中IOrderRepository
IOrderRepository
次のようにパラメーターを追加して、入力パラメーターを変更します。
public interface IOrderRepository : IRepository<Order>
{
Order Add(Order order, int par1, int par2);
}
私が知っているように、par1 and par2
DDD を実装するためのビジネス ルールはありませんIRepository
。
2-IOrderRepository
インフラストラクチャ レイヤーに移動
インフラストラクチャ レイヤーを配置できますがIOrderRepository
、これは別の間違ったアーキテクチャです。私の知る限り、この種のインターフェイスは に配置する必要があるためDomain layer
です。
私の最初の質問
1-インフラストラクチャ層のリポジトリのメソッドで追加のパラメーターを使用して、パラメーターとドメイン層の間に接続がないドメイン層の IRepository を実装するにはどうすればよいですか?
第二号
でわかるように、インクルード パラメーターと追加パラメーターを返すメソッドをIOrderRepository
実装する必要があります。私が知っているように、ドメイン層で DTO (Data Transfer Object) を使用することはできません。それを処理するアイデアが思いつきませんでした。GetAsync
OrderDTO
Order
私の2番目の質問
2-インフラストラクチャレイヤーにあるDTOメソッドを返す方法はありますが、ドメインレイヤーにあるDTO
OrderRepository
メソッドには適用できません。IOrderRepository
お時間をいただきありがとうございます。