次のようにユニティコンテナを登録しました:
var container = new UnityContainer();
container.RegisterType<ICacheManager, CacheManager>(new ContainerControlledLifetimeManager())
コントローラーからこの「コンテナー」にアクセスすることは可能ですか?
次のようにユニティコンテナを登録しました:
var container = new UnityContainer();
container.RegisterType<ICacheManager, CacheManager>(new ContainerControlledLifetimeManager())
コントローラーからこの「コンテナー」にアクセスすることは可能ですか?
なぜそれが必要なのかわかりませんが、コードは次のとおりです。
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));
その他の例については、こちらをご覧ください。
コンテナを使用して 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;
}
}
私が便宜上よく行う方法の 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;}
}
コンテナが登録した依存関係を自動的に解決します。