たとえば、私のプロジェクトでは、次のようなことを行うカスタム バインダーがあります (ここに示すように ViewModel で使用します)。
public interface IEntityResolver
{
object Find(string id);
}
public class PrimaryKeyResolver<T> where T: Entity
{
public PrimaryKeyResolver(IRepository<T> repository) {}
public object Find(string id)
{
return repository.Get(new Guid(id));
}
}
public class NameResolver<T> where T: NamedEntity
{
public NameResolver(IRepository<T> repository) {}
public object Find(string id)
{
return repository.Find(new { Name = id });
}
}
public class MyBinder: IModelBinder
{
public override object BindModel()
{
var id = ... //get id from context
var resolverType = typeof(IResolver<>).MakeGenericInterface(typeof(bindingContext.ModelType));
var resolver = ServiceLocator.Current.GetInstance(resolverType);
return resolver.Find(id);
}
}
では、どのような利点があり、なぜ IoC が重要なのですか? これにより、モデル バインダーをエンティティ解決の問題から解放し、懸念の分離を維持することができます。id とは何を意味し、エンティティを取得する方法はリゾルバーに委任されます。これは、任意のエンティティに対して同じ IModelBinder を再利用するのに役立ちます。(上記のように) ID ではなく名前で検索する場合は、モデル リゾルバーを提供する必要があります。
ここでの IoC (私は Service Locator を使用していますが、とにかく) は、適切なリゾルバーを見つけてインスタンス化するのに役立ちます。IoC コンテナーが自動的に渡す IRepository をリゾルバーが受け入れることに注意してください。
特定の質問については、もちろん、IModelBinder なしではなく IModelBinder と共に IoCを使用する必要がありますが、IoC を使用して IModelBinder をインスタンス化することもできます。これにより、ServiceLocator を使用する必要がなくなります。しかし、バインダーを作成する MVC をインターセプトする方法がわかりません。率直に言って、私は Locator に満足しているので気にしません。
KiGG に関しては、NerdDinner や Oxite などのサンプル プロジェクト (KiGG については何も言えません) に依存しないことをお勧めします。それらが「優れた設計」の参考資料であるかのように - 私が見る限り、それらは通常技術的な側面を示しています (つまり、機能)、良いデザインではありません。