8

次のようにユニティコンテナを登録しました:

    var container = new UnityContainer();

    container.RegisterType<ICacheManager, CacheManager>(new ContainerControlledLifetimeManager())

コントローラーからこの「コンテナー」にアクセスすることは可能ですか?

4

4 に答える 4

12

なぜそれが必要なのかわかりませんが、コードは次のとおりです。

public ActionResult Area51()
    {
        var _service = DependencyResolver.Current.GetService(typeof (IDummyService));

        return View();
    }

コントローラーを挿入する場合は、Global.asax のアプリケーションの開始時に IoC コンテナーを使用するように DepedencyResolver を設定する必要があります。次に、MVC はコントローラーに依存関係を自動的に挿入します。

var container = new UnityContainer();
DependencyResolver.SetResolver(new Unity.Mvc4.UnityDependencyResolver(container));

その他の例については、こちらをご覧ください。

http://www.dotnet-tricks.com/Tutorial/dependencyinjection/632V140413-Dependency-Injection-in-ASP.NET-MVC-4-using-Uni​​ty-IoC-Container.html

于 2014-07-26T23:49:36.513 に答える
6

コンテナを使用して Controller インスタンスを解決していると仮定しています。その場合は、他のコントローラーと同様に、コントローラーに IUnityContainer を依存関係として受け取るようにさせることができます。

何を達成しようとしていますか?解決されたクラスでコンテナーを取得することは、クラスをコンテナーと結合し、通常は他のメカニズムに置き換えることができるため、あまり良くありません。

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();

        var foo = container.Resolve<MyController>();
    }
}

public class MyController
{
    private IUnityContainer container;

    public MyController(IUnityContainer container)
    {
        this.container = container;
    }
}
于 2012-11-05T11:49:54.593 に答える
5

私が便宜上よく行う方法の 1 つは、次のように Global.ascx.cs ファイルでコンテナーをグローバル変数として宣言することです。

public class MvcApplication : System.Web.HttpApplication
{
    public static UnityContainer Container;

    protected void Application_Start()
    {
         // assuming your initialize here
    } 
}

ただし、これはかなりハックっぽいです。

正しいことは、Unity を使用してコントローラーを解決し (Unityコントローラー ファクトリの作成に関する記事を参照)、Unity がコントローラーを解決するときにコントローラーに依存関係を注入できるようにすることです。

したがって、コントローラーは次のようになります。

public MyController: Controller {

 public ICacheManager CacheManager {get;set;}

}

コンテナが登録した依存関係を自動的に解決します。

于 2012-11-05T11:57:14.667 に答える