0

ASP.NET プロバイダー モデルは、ある機能の個別の実装を Web アプリケーションに "プラグイン" できるという問題を解決する優れたテクノロジでした。プロバイダー モデルは一般に、構成を必要とする実装が少し面倒なので、最小限に抑えます。

IOC は、アプリケーションの各レベルで懸念事項を確実に分離する優れた方法であるため、すべてのコンポーネントの単体テストをサポートするために広く使用することをお勧めします。

Web アプリケーションが IOC コンテナーを使用している場合、プロバイダー モデルも使用するのは間違っているようです。なぜなら、既に抽象化されているものを抽象化して、2 つのレベルの複雑さを生み出しているように見えるからです (おそらく既存のプロバイダーを除いて - 私が話していることです)。カスタム プロバイダーの作成)。

(詳細については、私のブログ投稿を参照してください: http://healthedev.blogspot.com/2011/12/making-custom-built-applications.html )

私は IOC に AutoFac を使用しており、「構成のオーバーライド」を許可することが可能であるため、プロバイダー モデルが提供する同じソリューションを満たすための良い代替手段のように思えますが、MEF がこの要件をどのように満たすかについてはよくわかりません。私が行方不明になっているものが他にある場合は?

ASP.NET MVC Web アプリケーションをゼロから設計でき、パッケージ バージョンを販売しなければならないという要件がある場合、再コンパイルする必要なく、他のユーザーが特定のビットのデータ アクセスを "プラグイン" できるようにするにはどうすればよいでしょうか?あなたはそれを実装しますか?

4

2 に答える 2

1

これは、プラグ可能なコンポーネントが何であるかに依存すると思います。

プロバイダでなければならないものもあります。たとえば、標準の ASP.NET メンバーシップ プロバイダーの機能を使用している場合は、そこから機能を派生させる必要があります。そのような状況では、依存関係の解決を行い、DI に登録された実装への呼び出しを渡す一種の「プロキシ」プロバイダーを作成するのは簡単であることがわかりました。

たとえば、Autofac が MVC DependencyResolver に接続されていると仮定すると、メンバーシップ プロバイダーで次のように表示される場合があります。

public override bool ChangePassword(
  string username,
  string oldPassword,
  string newPassword)
{
  var provider = DependencyResolver.Current.GetService<IMembershipService>();
  return provider.ChangePassword(username, oldPassword, newPassword);
}

組み込みプロバイダーを分離できる自動機能は見つかりませんでした。

プロバイダーではないものについては、通常どおり IoC 機能を使用してください。Autofac のアセンブリ スキャン機能モジュールを使用した構成なしの IoC を好みます。これにより、基本的に、オーバーライドを含むアセンブリを bin フォルダーにドロップして、アプリを再起動できます。起動時にモジュールをスキャンして登録します。それよりも明確にしたい場合は、次のような独自の起動インターフェイスを作成できます...

public interface IMyStartup
{
  void Start(ContainerBuilder builder);
}

...そして、特定のインターフェースだけをスキャンし、その上で start メソッドを呼び出します。それを行う方法はたくさんあります (属性、型、特定の既知の場所にあるアセンブリなど) が、最終的にはアセンブリのスキャンに集約されます。

于 2011-12-13T17:31:08.307 に答える
0

Unity および構造マップも提供します。アセンブリ スキャンを提供します。Unity はこれを行うために auto.registration モジュールを必要とします。

于 2013-02-13T08:18:57.220 に答える