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 = ;
result.Msg = "上架产品成功";
}
catch (Exception ex)
{
result.ErrorCode = ;
result.Msg = ex.Message;
}
return result;
} }
}

unity使用注意点:

依赖中有依赖 参数名字一定要正确 这点很容易错

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

  1. Unity 依赖注入之二

    1. 构造子注入 1.1 构造子注入初级代码 container.RegisterType<IMyWork, MyWork>(new InjectionConstructor(new Bo ...

  2. Unity依赖注入使用详解

    写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...

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

    这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...

  4. C# Unity依赖注入

    简介: 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个过程中你不是一个控制者而是一个请求者,依赖于容器提供给你的资源,控制权落到了容器 ...

  5. Unity 依赖注入

    关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引 ...

  6. c# Unity依赖注入WebService

    1.IOC与DI简介 IOC全称是Inversion Of Control(控制反转),不是一种技术,只是一种思想,一个重要的面相对象编程的法则,它能知道我们如何设计出松耦合,更优良的程序.传统应用程 ...

  7. 使用Microsoft.Practices.Unity 依赖注入

    Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...

  8. 使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html

    Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...

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

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

随机推荐

  1. python画最最简单的折线图

    # encoding=utf-8import matplotlib.pyplot as pltfrom pylab import * #支持中文mpl.rcParams['font.sans-seri ...

  2. SetForegroundWindow

    SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口.键盘输入转向该窗口,并为用户改各种可视的记号.系统给创建前台窗口的线程分配的权限稍高于其他线程. ...

  3. springboot(十四):springboot整合shiro-登录认证和权限管理(转)

    springboot(十四):springboot整合shiro-登录认证和权限管理 .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...

  4. js中json数据简单处理(JSON.parse()和js中嵌套html)

    js中json数据简单处理(JSON.parse()和js中嵌套html) 一.总结 1.html中嵌套js:<script>js代码</script> 2.js中嵌套html ...

  5. 前端js实现打印excel表格

    产品原型: 图片.png 功能需求:点击导出考勤表格按钮,会自动下载成Excel格式 图片.png 图片.png jsp页面代码: <div class="tools"> ...

  6. USB 3.0规范中译本 第1章 引言

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 1.1 动机(Motivation) Universal Serial Bus (USB) 的原始动机来自于 ...

  7. dot-- 资源汇总

    http://graphviz.org/doc/info/attrs.htmlhttp://graphs.grevian.org/http://graphs.grevian.org/exampleht ...

  8. ssh登录很慢,登录上去后速度正常问题的解决方法

    1. DNS反向解析的问题 OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法.如果客户机的IP没有域名,或者 ...

  9. Android程序解析XML文件的方法及使用PULL解析XML案例

    一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...

  10. TCP三次握手和四次握手最直接的理解

    网上有非常多文章讲TCP为什么建立连接时须要三次握手,关闭连接时须要四次握手.讲了非常多原理.反而让非常多人难以理解. 事实上仅仅有一句话:TCP连接是两个端点之间的事.因为TCP连接是可靠连接,所以 ...