Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问 题。构建一个成功应用程序的关键是实现非常松散的耦合设计。下面介绍一下c#中使用unity的方法(我是以webapi项目为例,但本例中并没有针对 webapi做特殊处理)

1.新建一个mvc4 webapi项目,下面的例子只用到get方法

C#实例  Unity依赖注入使用

C#实例  Unity依赖注入使用

2.用nuget安装unity,如图

C#实例  Unity依赖注入使用

3.新建一个接口类,以及继承该接口的两个类

C#实例  Unity依赖注入使用

直接在api/values的get中尝试简单实现unity

using (IUnityContainer container = new UnityContainer())

            {

                container.RegisterType<IBook, BBook>();

                IBook a = container.Resolve<IBook>();

                var strResult = a.Write();

                return strResult;

            }  

然后在浏览器中查看,页面显示的返回值,是BBook的

如果container.RegisterType<IBook, BBook>();中的BBook改为ABook,返回值就是ABook的内容

C#实例  Unity依赖注入使用

config中代码如下

在configSections中加入

<section name="unity"

type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />

  

在configuration中加入

<unity  xmlns="http://schemas.microsoft.com/practices/2010/unity">

    <container>

      <register type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" />

    </container>

  </unity>

注意 type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" 

testunity.Models.IBook是命名空间加类名

testunity是程序集的名称

C#实例  Unity依赖注入使用

然后cs的代码改成

using (IUnityContainer container = new UnityContainer())

{

    UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");

    configuration.Configure(container);

    IBook a = container.Resolve<IBook>();

    var strResult = a.Write();

    return strResult;

}   

在浏览器中可以看到返回结果对应的是config中register的那个类

C#实例  Unity依赖注入使用

每次调用都要写IUnityContainer container = new UnityContainer()显然不是好办法

那就把container封装到一个单列类中

简单实现如下

public class ServiceLocator:IServiceProvider

    {

        private readonly IUnityContainer _container;

        private static readonly ServiceLocator instance = new ServiceLocator();

        private ServiceLocator()

        {

            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");

            _container = new UnityContainer();

            section.Configure(_container);

        }

        public static ServiceLocator Instance

        {

            get { return instance; }

        }

        public object GetService(Type serviceType)

        {

            return _container.Resolve(serviceType);

        }

        public T GetService<T>()

        {

            return _container.Resolve<T>();

        }

    }

 

cs代码修改如下

IBook a = ServiceLocator.Instance.GetService<IBook>();

var strResult = a.Write();

return strResult;

C#实例  Unity依赖注入使用

C#实例  Unity依赖注入使用

C#实例  Unity依赖注入使用

相关文章:

  • 2022-12-23
  • 2021-12-22
  • 2022-12-23
  • 2021-10-22
猜你喜欢
  • 2022-12-23
  • 2021-07-14
  • 2022-12-23
  • 2021-07-06
  • 2022-12-23
相关资源
相似解决方案