2

MVC4 アプリケーション内で、ユニティという名前の型の登録を解決する方法を理解したいと思います。

「Unity 3.0」と「Unity boostrapper for ASP.NET MVC」を使用しています。

Unity が DependencyResolver に登録されていることを理解しているため、依存関係リゾルバー メソッドを使用して、登録された型のインスタンスを取得できます。

これは、単純な登録を取り戻したい場合にうまく機能します。

例えば

//Registration
container.RegisterType<IFootballer, VanPersey>();

//Instantiation 
var footballer1 = DependencyResolver.Current.GetService<IFootballer>();

しかし、名前付き型登録への参照を取得したい場合、IDependencyResolver インターフェイスが名前付き型登録インスタンスを取得するための適切なメソッドを提供しているようには見えません。

Unity コンテナーに直接アクセスできる場合は、次のようにします。

//Registration 
container.RegisterType<IFootballer, VanPersey>("Attacker" );
container.RegisterType<IFootballer, NemanjaVidic>("Defender");

//Instantiation 
unityContainer.Resolve<IFootballer, Footballer>("Attacker")

私の質問は、名前付き登録のインスタンスを取得するために MVC アプリで unity を使用する最も適切な方法は何ですか。つまり、ユニティ コンテナーにアクセスできますか?

この質問は本番環境の実装に関するものではないことに注意してください。私はUnity(およびIoCコンテナを初めて)を見て、理解を深めるために結び付けています。

本番環境では、コントローラーのコンストラクターを介して依存関係を渡す可能性が高いことを理解していますが、実際には別の質問につながります。

次の例で、コントローラー コンストラクター インジェクションを使用するときに、どの名前付き型を解決したいかを示すにはどうすればよいでしょうか。

//Registration 
container.RegisterType<IFootballer, VanPersey>("Attacker" );
container.RegisterType<IFootballer, NemanjaVidic>("Defender");

//Instantiation 
public HomeController(IFootballer footballer)
4

2 に答える 2

5

ほとんどの場合、コンテナー自体も登録されているため、リゾルバーが解決できます。

var container = DependencyResolver.Current.GetService<IUnityContainer>();
var vanPersey = container.RegisterType<IFootballer, VanPersey>("Attacker" );

リゾルバーで試したことはありませんが、ServiceLocator.

于 2013-06-06T12:05:51.787 に答える
4

これが同じことをしたい他の誰かに役立つ場合、私は次のことを見つけました:

「Unity 3.0」と「Unity boostrapper for AP.NET MVC」を使用すると、依存関係リゾルバーを使用せずに Unity コンテナーに直接アクセスできる GetConfiguredContainer メソッドを公開する UnityConfig クラスにあることがわかりました。

UnityConfig からのスニペット

/// <summary>
/// Specifies the Unity configuration for the main container.
/// </summary>
public class UnityConfig
{
    #region Unity Container
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    });

    /// <summary>
    /// Gets the configured Unity container.
    /// </summary>
    public static IUnityContainer GetConfiguredContainer()
    {
        return container.Value;
    }
    #endregion
}

そのため、Unity コンテナーに直接アクセスして、名前付き型のインスタンスを取得できました。

var footballer1 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Attacker");
var footballer2 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Defender");
于 2013-06-10T09:33:25.990 に答える