随笔 - 54  文章 - 0  评论 - 1  阅读 - 46463

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();
        }
复制代码

 

posted on   hahanonym  阅读(971)  评论(0编辑  收藏  举报
编辑推荐:
· .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 边框边界填充理解
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示