、などのエンティティのクラスがあり、それぞれに 、などのマネージャ クラスがありますShip
。すべてのマネージャ クラスは を実装し、エンティティは を実装します。Shampoo
Horse
ShipManager
ShampooManager
HorseManager
IManager
IEntity
これで、エンティティを保存するためだけに記述された静的関数が次のようになります。
public static bool Save<S, T>(S entity, string msg) where S : IEntity
where T : IManager<S>, new()
{
string possibleError;
switch (new T().Save(entity, out possibleError))
{
//---------------------
}
return true;
}
ここでの優雅さは、私がSave
好きなSave<Radio, RadioManager>
ものを呼び出さなければならないということです。私が欲しいのは、次のようなものです:
public static bool Save<T>(T entity, string msg) where T : IEntity
{
string possibleError;
switch ((/*find manager here*/).Save(entity, out possibleError))
{
//---------------------
}
return true;
}
これを行う方法はいくつかありますが、ジェネリックと型推論を含むものがあればいいのにと思います。エンティティ クラスと対応するマネージャー クラスを設計によって結合して、型の安全性も実現するのは良いことだと思います。
拡張メソッドの助けを借りて、私ができることは次のとおりです。
public static bool Save<T>(this IManager<T> mgr, T entity, string msg) where T : IEntity
{
string possibleError;
switch (mgr.Save(entity, out possibleError))
{
//---------------------
}
return true;
}
私が呼び出すことができるように:
FooManager fMgr = new FooManager();
fMgr.Save(foo, "success");
しかし、ここでは常に をインスタンス化し、そのインスタンスIManager
でメソッドを呼び出す必要がありSave
ます。それほど多くの反復的なコードを避け、静的関数に義務を負わせたいと思っています。エンティティのマネージャが自動的に推論されるように、との間に関係を持つようにクラスを設計するにはどうすればよいですか?IManager
IEntity
編集:Save
マネージャークラスのメソッドをエンティティクラスに移動する余裕がないことに注意してください(これにより、作業が楽になります)。全体の設計は、1 つのエンティティ クラスと対応するマネージャー クラスに基づいています。なので、我慢しようと思っています。