0

こんにちは、助けてくれてありがとう。

MVC3 アプリケーションで Unity をどのように構築しているかについて質問があります。

現時点では、この便利なサンプル コードから Unity の実装をモデル化しました。

http://kevww.wordpress.com/2012/01/04/dependency-injection-with-unity-2-0-in-mvc-3/

私はそれをうまく動作させることができますが、少し異なるアプローチがあるかどうか自問しています. 基本的に、このソリューションは 2 つのクラスを必要とします。最初のクラスは依存関係リゾルバーです。

public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer _container;

public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}

public object GetService(Type serviceType)
{
object instance;
try
{
instance = _container.Resolve(serviceType);
if (serviceType.IsAbstract || serviceType.IsInterface)
{
return null;
}
return instance;
}
catch (Exception e)
{
return null;
}
}

public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType);
}
}

そして、Global.asax から呼び出されるセットアップを含む Unity コンテナー セットアップ クラス:

public class UnityContainerSetup
{
public static void SetUp()
{
var container = new UnityContainer();
container.RegisterType<ISomeService, SomeService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}

では、私の質問です。この Unity 実装を実際に分離するより良い方法はありますか?

別のプロジェクトを作成し、その中に上記の 2 つのクラスを配置しました。System.Web.Mvcその新しいプロジェクトで解決するために参照した後、それはうまくいきましたIDependencyResolver

ただし、同じリポジトリと DAL を使用する Web フォーム アプリケーションなど、別のものから Unity を使用するために共通アセンブリを再利用したい場合も、あまり意味がないように思えました。

それとも、これは Unity を機能させるために必要な単なる配管ですか? つまり、さまざまなプロジェクトで Unity の実装を変更した場合、それぞれのプロジェクトに順番にアクセスする必要がありますか? それとも、私のアプローチは中間の妥協点で問題ありませんか?

ここで私にとって明らかな問題はIDependencyResolver、 が MVC の一部であることです。したがって、団結のための「共通の」アセンブリがMVCでどのように行われるかはわかりません。

4

1 に答える 1

1

コンテナーのセットアップは常に必要ですが、DependencyResolver を直接使用するのではなく、ControllerFactory を作成して MVC に登録することができます。Unity での例については、こちらを参照してください。

これにより、すべての依存関係とその解決をコントローラーに保持でき、プレゼンテーションレイヤーに渡すものはすべてフラットモデルまたは単純なビューデータである必要があります。

于 2012-07-17T04:04:02.077 に答える