使用Unity依赖注入的时候,最上层的类是Resolve还是New的问题

在使用Unity的时候,很多时候是这样一种引用的关系。就是一个类需要另一个类在其中做工具类。因为是构造方法注入,所以要在构造方法中加入一个引用参数。

    public interface IRepository
    {
        void Execute();
    }

    public class Repository : IRepository
    {
        public void Execute()
        {
            // Some database operation
        }
    }

    public interface IService
    {
        void Execute();
    }

    public class Service : IService
    {
        private IRepository _repository;

        public Service(IRepository repository)
        {
            this._repository = repository;
        }

        public void Execute()
        {
            _repository.Execute();
        }
    }

但是我们使用Service的时候,比如说我们想在A类中使用Service,那么我们必须要在A的构造方法中加入一个Service的参数. 而且必须也要把A放入到Unity中去控制才行,才能通过Resolve方法的时候,Resovle到一个具有了IService实例的A实例。

    public class A
    {
        private IService _service;

        public A(IService service)
        {
            this._service = service;
        }

        //...
    }

但是有时候我们只是希望把Service层以下放到Unity中控制,而A这一层的类不希望放到Unity中控制。这时我们可以从Unity中去要Service的实例。Unity的容器必须要进行整个程序范围内的共用,不能说是每用一个类的时候都new一个Unity的容器,并且读取配置文件初始化,这样太消耗性能,是错误的。怎么样才能做到Unity是整个程序范围内的功用?我们可以使用static的一个属性指向UnityContainer,因为zhege变量是存在静态存储区的,在整个程序的运行过程中是不会消失的,所以程序中的所有时候都能共享这个Unity缓存。

    public static class ContainerFactory
    {

        private static volatile IUnityContainer _container;
        private static readonly object SyncRoot = new object();

        public static IUnityContainer CreateUnityContainerExe()
        {

            return CreateUnityContainer(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
        }

        private static IUnityContainer CreateUnityContainer(Configuration configuration)
        {
            if (_container != null)
            {
                return _container;
            }

            lock (SyncRoot)
            {
                if (_container != null)
                {
                    return _container;
                }

                return _container = InitializeContainer(configuration);
            }
        }

        private static IUnityContainer InitializeContainer(Configuration configuration)
        {
            var result = new UnityContainer();

            foreach (var section in configuration.Sections)
            {
                var unityConfigurationSection = section as UnityConfigurationSection;
                if (unityConfigurationSection != null)
                {
                    result.LoadConfiguration(unityConfigurationSection);
                }
            }

            return result;
        }
    }

这样我们每次就可以从同一个UnityContainer中要对象实例了。只要在配置文件中注册了这个IService接口和Service类,就可以Resolve了。

IUnityContainer _unityContainer = ContainerFactory.CreateUnityContainerExe();
IService service = _unityContainer.Resolve<IService>();

但是每次都使用这两段代码会觉得比较麻烦,能不能我们只new一下Service,而Service中的工具类都是注入进来的呢?这个我们可以通过在构造方法中重载实现。

    public class Service : IService
    {

        private IRepository _Repository;

        public Service()
            : this(ContainerFactory.CreateUnityContainerExe()) //这个构造方法是给直接new这个Service的时候用的,会去静态类中找Container,                                                                     获取一个Repository的实例,放入到这里
        {
        }

        private Service(IUnityContainer container)
            : this(container.Resolve<IRepository>())
        {

        }

        public Service(IRepository Repository)// 这个构造方法是给Unity用的,当Unity读取配置文件,知道要new一个这样的实例的时候,会调用这个构造                                                       方法,并且把需要的参数传进来
        {
            this._Repository = Repository;
        }

        public void Save()
        {
            _Repository.Execute();
        }

    }

这样,我们在任何的类中,IServicee service = new Service()的时候,其里边的Repository都是从Unity中要的,而这里对于这一层是透明的,我们只需要new就可以了。

使用Unity依赖注入的时候,最上层的类是Resolve还是New的问题

时间: 2024-08-29 02:51:00

使用Unity依赖注入的时候,最上层的类是Resolve还是New的问题的相关文章

DDD实战8_2 利用Unity依赖注入,实现接口对应实现类的可配置

1.在Util类库下新建DIService类 /// <summary> /// 创建一个类,对应在配置文件中配置的DIServices里面的对象的 key /// </summary> public class DIService { public string InterfaceType { get; set; } public string ImplementationType { get; set; } } 2 在webapi的appsettings.json文件中配置 要

验证Unity依赖注入的对象是否为同一个实例

在使用Unity的时候,能够很好的解耦,解除层与层之间的依赖性.这里有一个问题,每次向Unity中要对象实例的时候,这时候给出的是同一个吗?还是每次都是new一个新的?我来写代码验证一下.怎么验证两个对象是否为同一个呢,看这个对象在内存中的地址就行了,通过Hash码查看就可以. namespace UnityApplication { public interface IService { string Show(); } } namespace UnityApplication { publi

WPF PRISM开发入门二(Unity依赖注入容器使用)

这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点击这里下载. 运行效果如下: 下面将引入Unity类库,使用Unity来生成需要的对象实例. 先查看一下CalculateRelpLoop类, public class CalculateRelpLoop : ICalculateRelpLoop { ICalculateService _calcu

Unity 依赖注入

关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引用Microsoft.Practices.Unity.dll和Microsoft.Practices.Unity.Configuration.dll,下面我们就一步一步的学习下Unity依赖注入的详细使用.如果不明白什么是控制反转和依赖注入,请参考控制反转和依赖注入模式 下面通过一个示例来讲解Uni

Unity依赖注入使用详解

Unity依赖注入使用详解 写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册配置问题 Unity的app.config节点配置 后记 关于 控制反转 (Inversion of Control)和 依赖注入 (Dependency Injection)大家网上可以找下相关概念,在 <小菜学习设计模式(五)—控制反转(Ioc)> 这篇文章中本人也

使用Microsoft.Practices.Unity 依赖注入

Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入(Constructor Injection).属性注入(Property Injection),以及方法调用注入(Method Call Injection). 假设我们有下面的场景代码,在代码里面有一个很简单的customer对象,customer 对象有个save 方法, 这个方法通过调用ICusto

c# Unity依赖注入WebService

1.IOC与DI简介 IOC全称是Inversion Of Control(控制反转),不是一种技术,只是一种思想,一个重要的面相对象编程的法则,它能知道我们如何设计出松耦合,更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之 间高耦合,难于测试:有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活.其实IoC 对编程带来的最大改变不是

WebApi学习笔记06:使用webapi模板--仓储模式--Unity依赖注入

1.Web项目 1.1概述 对数据操作封装使用存储模式是很常见的方式,而使用依赖注入来降低耦合度(方便创建对象,可以抛弃经典的工厂模式)…… 1.2创建项目 1.3添加模型 在Models下,添加Product.cs: namespace WebApi06.Models { public class Product { public int ID { get; set; } public string Name { get; set; } public decimal Price { get;

Unity依赖注入

一.简介 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合设计. 二.使用 1.安装 Unity插件. 进入NuGet,输入Unity.在相应的项目安装. 2.config中代码配置. 在configSections中加入    <section name="unity" type="Microsoft.Practices.U