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(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2016-04-12 E3Upload项目总结
2014-04-12 边框边界填充理解