是否可以在控制器中获取当前的Unity容器

Ser*_*gey 7 c# unity-container

我注册了这样的统一容器:

    var container = new UnityContainer();

    container.RegisterType<ICacheManager, CacheManager>(new ContainerControlledLifetimeManager())
Run Code Online (Sandbox Code Playgroud)

是否可以从控制器访问此"容器"

sta*_*247 11

不确定为什么需要它,但这里是代码:

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

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

如果你要做的是注入一个Controller,你应该设置DepedencyResolver来在Global.asax的应用程序启动中使用你的IoC容器.然后,MVC将自动为您的控制器注入依赖.

var container = new UnityContainer();
DependencyResolver.SetResolver(new Unity.Mvc4.UnityDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)

在这里查看更多示例:

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


fsi*_*zzi 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


she*_*nku 5

为方便起见,我经常这样做的一种方法是将您的容器声明为Global.ascx.cs文件中的全局变量,如:

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

    protected void Application_Start()
    {
         // assuming your initialize here
    } 
}
Run Code Online (Sandbox Code Playgroud)

然而,这是相当黑客的.

正确的做法是使用Unity来解析您的控制器(请参阅有关创建统一控制器工厂的文章),然后允许Unity在解析控制器时将任何依赖项注入控制器.

所以控制器如:

public MyController: Controller {

 public ICacheManager CacheManager {get;set;}

}
Run Code Online (Sandbox Code Playgroud)

将自动解析您的容器已注册的任何依赖项.