Ioc とジェネリック、特に私の会社がこれに関連するレイヤーをどのように設定しているかについて頭を悩ませています。私たちは MVP アーキテクチャの下で作業しています。
私は車のクラスを持っています:
class Car : ICar
{
IList<IWheel> wheels{get;set;}
IEngine engine{get;set;}
string registrationplate {get;set;}
public Car(){}
}
新しく作成された ICar を取得できるようにしたいのですが、ID で ICar を見つけられるようにしたいと考えています。問題は、私が取り組んでいるプロジェクトでいくつかの設計上の選択がなされた理由がわからないことです。すでに作成されている他のサービスの構造は次のとおりです。
私は車と車輪のサービスを持っています:
class WheelService : BaseService
{
IWheel wheel;
public IWheel Create()
{
return new wheel()
}
}
class CarService : BaseService
{
WheelService wheelservice;
public ICar CarCreate()
{
wheelservice = new Wheelservice()
car = new Car();
IWheel wheel = wheelservice.Create();
car.wheels.add(wheel);
return car;
}
public ICar Find(int id)
{
return (Car)base.Find<Car>(id);
}
}
まず、「エンティティごとにサービスを提供する」というのは奇妙だと思います。弱い存在にサービスがあるとは思いもしませんでした。私の考えでは、CarService の create メソッドは、ホイール サービスを呼び出さなくても、ファクトリ メソッドのように機能すると思います。
また、ホイール サービスの create メソッドは、プレゼンター コードで実際に使用されて、IWheel を UI に戻すため、値を設定して戻すことができます。繰り返しますが、私には奇妙に思えます。プレゼンターが UI から完全な ICar オブジェクトを要求できることを意味します。Service create メソッドの依存関係は正常ですか? これは IoC を通じて導入されると考えていたでしょう。しかし、ICar の Create メソッドがすべての作成 (ホイールなどを含む) を処理する場合、コンテナにはこの特定のサービスに関連する多くのインターフェイスが含まれているのではないでしょうか?
インターフェイスを導入する場合、現在具象クラスを使用している CarService.Find メソッドを調整する必要があります。これは BaseService を使用し、コンテナーとやり取りして正しいリポジトリを取得するのはこのレイヤーのみです。
class BaseService
{
private object myRepository;
protected T GetRepository<T>(Type serviceType)
{
if (myRepository == null)
{
myRepository = (T)IoCRepositoryFactory.GetRepositoryInstance(typeof(T), serviceType);
}
return (T)myRepository;
}
protected virtual IGenericRepository Repository
{
get
{
return GetRepository<IGenericRepository>(this.GetType());
}
}
protected virtual T Find<T>(Object id) where T : class
{
return (T)Repository.GetByID<T>(id);
}
}
現在のサービス定義は具体的なクラスを使用しているため、インターフェイスのみを使用している場合、この find メソッドを呼び出す方法がわかりません。
これが長文の投稿であることをお詫びします。私はこれを 3 日間調べてきましたが、他の人が現在の設定についてどう考えているか、サービス層のドメイン オブジェクトに IOC を使用する必要があるかどうか、または現在の設定に従う必要があるかどうかを知る必要があります。現時点では、すべてが少し結びついているように感じます。