0

Scott Hanselman は、"<a href="http://www.hanselman.com/blog/IPrincipalUserModelBinderInASPNETMVCForEasierTesting.aspx" rel="nofollow noreferrer">ASP の IPrincipal (User) ModelBinder. NET MVC を使用すると、テストが簡単になります」と彼は、このかなり防御的なコメントをしなければならないと感じました。

はい、これにも IoC コンテナーを使用できることがわかりました。

彼は、IModelBinderの代わりにIOC を使用できたということですか、それとも、 IModelBinderIOC と共に使用する必要があると言っているのですか? 汎用プログラミング言語を使用して非常に多くのことができることを理解した上で (今は防御的になっています)、現実のシナリオでは実際に何が行われているのでしょうか? たとえば、KiGGのようなプロジェクトは、IModelBinder をまったく使用していないようです。

4

2 に答える 2

1

たとえば、私のプロジェクトでは、次のようなことを行うカスタム バインダーがあります (ここに示すように 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 については何も言えません) に依存しないことをお勧めします。それらが「優れた設計」の参考資料であるかのように - 私が見る限り、それらは通常技術的な側面を示しています (つまり、機能)、良いデザインではありません。

于 2009-10-02T17:57:49.243 に答える
0

これをcodeplexhttp://mvcunity.codeplex.com/に追加したところ、役立つかもしれません。サンプルアプリケーションも追加しました。ご不明な点がありましたらお知らせください。

于 2010-01-17T00:57:08.667 に答える