使用Unity返回Service(Class)实例

时间:2015-04-14 12:22:09

标签: c# instance unity-container

目前我有类Factory已经实现了返回管理服务实例的方法(某些类)

public static class Factory
{
    //#region UserNewEditDelete
    public static IUserBM UserCreation()
    {
        return new UserBM();
    }
    //#endregion
}

使用Unity Framework重写此类Factory的正确方法是什么?


我的愿景::

我的工厂:

public static class Factory
    {
        public static void Register(IUnityContainer container)
        {
            container.RegisterType<IUserBM, UserBM>();
        }
    }

在Global.asax中注册:

Factory.Register(UnityConfig.GetConfiguredContainer());

当我需要使用管理服务时:

UnityConfig.Container.Resolve<IUserBM>()

这是好的实施吗?感谢。

1 个答案:

答案 0 :(得分:1)

创建统一容器:

var unityContainer = new UnityContainer();
unityContainer.RegisterType<IUserBM, UserBM>();

需要实例时的用法:

var userBm = unityContainer.Resolve<IUserBM>();

Unity非常聪明,可以在需要时注入该类型,例如:

public class A
{
    private IUserBM userBm;
    public A(IUserBM userBm)
    {
        this.userBm = userBm;
    }

    public void DoSomething()
    {
        this.userBm.Work();
    }
}

// this will construct an instance of class A injecting required types
var a = unityContainer.Resolve<A>();
a.DoSomething();

与ASP.NET MVC的Unity

安装nuget package Unity.Mvc后,从RegisterTypes

编辑方法UnityConfig.cs
    public static void RegisterTypes(IUnityContainer container)
    {
        unityContainer.RegisterType<IUserBM, UserBM>();
    }

现在,如果您需要控制器中的IUserBm实例,请添加构造函数参数:

public class HomeController : Controller
{
    private IUserBm userBm;

    public HomeController(IUserBm userBm)
    {
      this.userBm = userBm;
    }
    ...

Unity将为您创建一个控制器,提供已注册类型的实例,这要归功于安装软件包时自动设置UnityDependencyResolver

有关详细信息,请参阅ASP.NET MVC 4 Dependency Injection