最初の警告: 長い投稿で、とにかくパターンが完全に間違っている可能性があります:
Customer Aggregate の開始である次のクラスがあるとします。
public class Customer : KeyedObject
{
public Customer(int customerId)
{
_customerRepository.Load(this);
}
private ICustomerRepository _customerRepository = IoC.Resolve(..);
private ICustomerTypeRepository = _customerTypeRepository = IoC.Resolve(..);
public virtual string CustomerName {get;set;}
public virtual int CustomerTypeId [get;set;}
public virtual string CustomerType
{
get
{
return _customerTypeRepository.Get(CustomerTypeId);
}
}
}
また、CustomerType は値オブジェクトで表されます。
public class CustomerType : ValueObject
{
public virtual int CustomerTypeId {get;set;}
public virtual string Description {get;set;}
}
CustomerTypeId を持つ顧客オブジェクトがある場合は、これで十分です。ただし、MVC ビュー内に DropDownList を設定する場合、ICustomerTypeRepostory から CustomerType 値リストを正しく取得する方法の概念に苦労しています。
はICustomerTypeRepository
非常に簡単です。
public interface ICustomerTypeRepository
{
public CustomerType Get(int customerTypeId);
public IEnumerable<CustomerType> GetList();
}
基本的にはコントローラーから正しく呼び出せるようにしたいのですがICustomerTypeRepository
、コントローラーからDAL(リポジトリ)レイヤーを分離するのが一番いいと思いました。さて、私は物事を過度に複雑にしていますか?
これが私のコントローラーの現在の状態です。
public class CustomerController : ControllerBase
{
private ICustomerTypeRepository _customerTypeRepository = IoC.Resolve(..);
public ActionResult Index()
{
Customer customer = new Customer(customerId);
IEnumerable<CustomerType> customerTypeList =
_customerTypeRepository.GetList();
CustomerFormModel model = new CustomerFormModel(customer);
model.AddCustomerTypes(customerTypeList );
}
}
Controller と Customer にリポジトリがあるので、これは私には間違っているようです。CustomerType 用に分離されたアクセス レイヤーが必要であることは、私には論理的に思えます。すなわちCustomerType.GetList()
:
public class CustomerType : ValueObject
{
// ... Previous Code
private static ICustomerTypeRepository _customerTypeRepository = IoC.Resolve(..);
public static IEnumerable<CustomerType> GetList()
{
_customerTypeRepository.GetList();
}
}
では、オブジェクトを からに公開する方法はどれですか?CustomerType
ICustomerTypeRepository
CustomerController