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文件中配置 要依赖注入的 接口和实现类

3 为Util类库项目 nuget安装 Unity.Container和Unity.Servicelocator两个包

4.创建服务定位器 ServiceLocator类

namespace Util
{

    public class ServiceLocator : IServiceProvider//IServiceProvider 这个接口是系统自带的
    {
        private readonly IUnityContainer container;
        public ServiceLocator()
        {
            container = new UnityContainer();
            //要使用JObject 必须安装 Newtonsoft.Json 包
            //读取配置文件 得到一个json对象
            var jsonServices = JObject.Parse(File.ReadAllText("appsettings.json"))["DIServices"];
            //将上面的jsonServices 转成List<DIService>的集合
            var requestServices = JsonConvert.DeserializeObject<List<DIService>>(jsonServices.ToString());
            //遍历服务对象
            foreach (var requestService in requestServices)
            {
                //向容器中注册
                container.RegisterType(Type.GetType(requestService.InterfaceType), Type.GetType(requestService.ImplementationType));
            }
        }

        public T GetService<T>()
        {
            return container.Resolve<T>();
        }

        //下面这个方法是IServiceProvider接口要求实现的
        public object GetService(Type serviceType)
        {
            return container.Resolve(serviceType);
        }

        public T GetService<T>(ParameterOverrides parameters)
        {
            return container.Resolve<T>(parameters);
        }
    }
}

5 使用服务定位器 实践依赖注入

namespace Product.WebApi.Controllers
{
    [Produces("application/json")]
    [Route("api/Product")]
    public class ProductController : Controller
    {
        //这个无参构造函数一旦执行 就完成了接口和实现的映射
        ServiceLocator serviceLocator = new ServiceLocator();
        [HttpPost]
        [Route("AddProduct")]
        public  ResultEntity<bool>  AddProduct([FromBody] AddProductSPUDto addProductSPUDto)
        {
            var result = new ResultEntity<bool>();
            //var productdbcontext =new ProductEFCoreContext();
            //var irepsotory = new EFCoreRepository(productdbcontext);
            //var iproductrepsitory = new ProductEFCoreRepository(productdbcontext);
            var productdbcontext = serviceLocator.GetService<IProductContext>();
            //下面 new Unity.Resolution.ParameterOverrides() { { "context", productdbcontext } }
            //{   }里面还有{  }是因为这是个parameters 说明可能有多个参数对象
            //{ "context", productdbcontext } 第一个context是因为 public EFCoreRepository(DbContext context) 的形参 是context
            //值就是咱们上面要传进去的 productdbcontext
            var irepsotory = serviceLocator.GetService<IRepository>(new Unity.Resolution.ParameterOverrides() { { "context", productdbcontext } });
            var iproductrepsitory = serviceLocator.GetService<IProductRepository>(new Unity.Resolution.ParameterOverrides() { { "context", productdbcontext } });
            var addproductspuusecase = new AddProductSPUUseCase(irepsotory, iproductrepsitory);
            try
            {
                result = addproductspuusecase.AddProduct(addProductSPUDto);
                result.IsSuccess = true;
                result.count = 1;
                result.Msg = "上架产品成功";
            }
            catch (Exception ex)
            {
                result.ErrorCode = 100;
                result.Msg = ex.Message;
            }
            return result;
        }

    }
}

原文地址:https://www.cnblogs.com/wholeworld/p/9344764.html

时间: 2024-08-03 05:37:49

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

验证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)> 这篇文章中本人也

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

在使用Unity的时候,很多时候是这样一种引用的关系.就是一个类需要另一个类在其中做工具类.因为是构造方法注入,所以要在构造方法中加入一个引用参数. public interface IRepository { void Execute(); } public class Repository : IRepository { public void Execute() { // Some database operation } } public interface IService { voi

使用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 对编程带来的最大改变不是

大话依赖倒置?控制反转?依赖注入?面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些“高深术语”感到过困扰——依赖倒置•控制反转•依赖注入•面向接口编程.也许时至今日,你仍对它们一知半解.不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. ·内聚 内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做. 经典理论告诉我们,程序的两大要素:一个是数据(data),

基于DDD的.NET开发框架 - ABP依赖注入

返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ABP的官方网站:http://www.aspnetboilerplate.com ABP官方文档:http://www.aspnetboilerplate.com/Pages/Documents Github上的开源项目:http