C# 利用Unity 实现IOC+AOP
public interface INoticy
{
void Noticy(string msg);
}
public class SMSNoticy : INoticy
{
public void Noticy(string msg)
{
Console.WriteLine(msg);
}
}
public class Alarm
{
[Dependency]
public INoticy Noticy { get; set; }
public void TriggerAlarm()
{
Noticy.Noticy("test");
}
}
public class ComponentInterceptor : IInterceptionBehavior
{
public bool WillExecute
{
get
{
return true;
}
} public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
} public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine("Before the call");
var result = getNext()(input, getNext); Console.WriteLine("After the call"); return result;
}
}
public class TestMain
{
public void test()
{
var container = new UnityContainer();
container.AddNewExtension<Interception>();
var interceptor = new Interceptor<InterfaceInterceptor>();
var interceptionBehavior = new InterceptionBehavior<ComponentInterceptor>(); container.RegisterType<INoticy, SMSNoticy>( interceptor, interceptionBehavior);
container.RegisterSingleton<Alarm>();
var alarm = container.Resolve<Alarm>();
alarm.TriggerAlarm(); }
}
依赖注入最常见的有,构造函数注入,属性注入,接口注入
大型项目比较通用的做法是,将需要注入的内容,放在config中,让程序自动加载注入
在需要使用的地方,直接resolve想要的对象就行,大型项目通过IoC实现各种new对象的操作,IoC最底层是通过activator.createinstance 实现
依赖注入并不需要项目引用DLL,只用保证生成的目录中有DLL就行
附带一例 配置实现的例子
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" />
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
<alias alias="INoticy" type="ClassLibrary1.INoticy, ClassLibrary1"/>
<alias alias="SMSNoticy" type="ClassLibrary2.SMSNoticy, ClassLibrary2"/>
<!--<alias alias="SMSNoticy1" type="ClassLibrary2.SMSNoticy1, ClassLibrary2"/>-->
<alias alias="IAlarm" type="ClassLibrary1.IAlarm, ClassLibrary1"/>
<alias alias="Alarm" type="ClassLibrary3.Alarm, ClassLibrary3"/>
<alias alias="Alarm" type="ClassLibrary3.Alarm, ClassLibrary3"/>
<alias alias="ComponentInterceptor" type="WindowsFormsApplication1.ComponentInterceptor, WindowsFormsApplication1"/>
<container name= "SMS">
<extension type="Interception" />
<register type= "INoticy" mapTo= "SMSNoticy"/>
<register type= "IAlarm" mapTo= "Alarm">
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior name="ComponentInterceptor" type="ComponentInterceptor" />
</register>
</container>
</unity>
</configuration>
public void test()
{
var container = new UnityContainer(); var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = "unity.config" }; //"Config/unity.config"
var configuration =
ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
container.LoadConfiguration(unitySection,"SMS"); var alarm = container.Resolve<IAlarm>();
alarm.TriggerAlarm();
}
C# 利用Unity 实现IOC+AOP的更多相关文章
- Unity 处理IOC AOP
用Unity 可以做IOC(控制反转) AOP(切面)可以做统一的异常和日志处理,非常方便,项目中是用微软企业库中的Microsoft.Practices.Unity实现 1 定义接口与实现 //定义 ...
- Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- spring ioc aop 原理
spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...
- C#利用Emit反射实现AOP,以及平台化框架封装思路
C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...
- Unity容器中AOP应用示例程序
转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- Unity(IOC)学习笔记
原文:Unity(IOC)学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79432 ...
- 利用Unity制作“表”
一枚小菜鸟 目前没发现在Unity有其他路径制作类似于c# WinForm中的表:但是利用Unity自带的UGUI,制作了一张"伪表",具体方案如下: 效果图如下: 步骤: 1 ...
- IOC AOP 设计模式
IOC AOP 不是什么技术而是一种设计模式 学习 IOC AOP 其实是在学习一种思想. 1.IOC IOC其实是 将对象的创建和获取提取到外部.由外部IOC容器提供需要的组件. 看下面代码: p ...
随机推荐
- Python统计excel表格中文本的词频,生成词云图片
import xlrd import jieba import pymysql import matplotlib.pylab as plt from wordcloud import WordClo ...
- HslCommunication组件库使用说明 (转载)
一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...
- javascript 对象数组排序(按照科目级次)
需求 从后台获取的数据是这样的 上帝要这样的 背景 从后台获取到表格数据,然后填充到excel.当然是用js来填充的.js 本身的数组具有sort()功能.但是是针对 ...
- [转]https://www.jianshu.com/p/06443248f4d8
eos是什么? 原文 https://www.jianshu.com/p/06443248f4d8 简介 用一句话来定义eos,即:区块链操作系统,支持在它之上构建dapp,支持智能合约.帐户.身份验 ...
- 使用docker部署springboot应用
1.构造Dockerfile打包文件 # from base image centos FROM centos #MAINTAINER lirenqing #Java Version #ENV JAV ...
- jQuery-4.动画篇---淡入淡出效果
jQuery中淡出动画fadeOut 让元素在页面不可见,常用的办法就是通过设置样式的display:none.除此之外还可以一些类似的办法可以达到这个目的.这里要提一个透明度的方法,设置元素透明度为 ...
- spring boot 单元测试
Java新手 纯记录 @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = OutDemoApplication.clas ...
- 请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
这是牛客网上的一道题~ 题意:遇到重复元素就删除(留下第一个不重复的即可). 解题思路:双循环一遍数组,arr[i] == arr[j] 成立时,删除 arr[j],并将 arr[j] 直接push到 ...
- angular6 引用echart第一次数据不显示解决
1 使用promise从后台返回数据后,页面还是比数据更快的加载出来,导致echart图页面加载的时候不显示问题 1.1 html <div echarts [options]="do ...
- Spring事务<tx:annotation-driven/>的理解(Controller使用@Transactional)
在使用Spring的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用. <tx:an ...