Unity框架入门

介绍Unity框架之前,先要说几个概念DIP依赖倒置原则、IOC控制反转、DI依赖注入

DIP是设计原则之一,定义:上层不应该依赖于底层,两者都依赖于抽象; 抽象不依赖于细节,细节应该依赖于抽象。

像这种设计原则的定义,干巴巴的看,很难整明白,必须结合实际例子才能理解;

以人们用华为手机通信为例:

复制代码
    class HuaWei
    {
        public void Dial()
        {
            System.Console.WriteLine("华为手机拨号。。");
        }
    }

    class Person
    {
        private  HuaWei phone = new HuaWei();

        public void Communicate()
        {
            phone.Dial();
        }
    }
复制代码

在这个例子中,Person属于上层,HUAWEI属于底层,上层依赖于底层,假设底层发生变动,华为手机坏了,需要更换手机进行通信,我们就需要修改Person代码;后面再发生底层变动,Person还需要变化

像这种简单场景下,修改的代价还值得忍受,如果是一个复杂系统,这种频繁变动的代价是昂贵的。

这个时候,我们就需要把变化封装,Person不再依赖于Huwei,而是依赖于抽象接口,HUAWEI也依赖于这个抽象接口。 这就是依赖倒置原则。

复制代码
    interface IPhone
    {
        void Dial();
    }
    class HuaWei:IPhone
    {
        public void Dial()
        {
            System.Console.WriteLine("华为手机拨号。。");
        }
    }

    class Person
    {
        private IPhone phone;

        public Person(IPhone phone)
        {
            this.phone = phone;
        }

        public void Communicate()
        {
            phone.Dial();
        }
    }
复制代码

还是最初的例子,Person因为依赖于Huwei,需要在Person内部new一个HUAWEI对象才能使用,这种耦合性非常大,IOC就是将new一个Huawei对象的操作交给另外一个容器去处理,我们只是从容器获取这个对象,这就叫控制反转。

DI依赖注入是IOC的实现方式,可以是构造器注入,属性注入,也可以是方法注入

Unity就是.net平台下,开源的IOC框架。

不多说,一步步上代码。

我们以DataBase组件和Log组件为原型,实现Unity框架的演示Demo

1
2
3
4
5
6
7
8
9
namespace UnityLib
{
    public interface ILog
    {
        void WriteLog(string msg);
 
        void WriteLog(Exception ex);
    }
}

  

复制代码
    public class ConsoleLog:ILog
    {
        public void WriteLog(string msg)
        {
            Console.WriteLine("Console Log" + msg);
        }

        public void WriteLog(Exception ex)
        {
            Console.WriteLine("Console Log:" + ex.StackTrace);
        }
    }
复制代码
复制代码
  public class FileLog:ILog
    {
        public void WriteLog(string msg)
        {
            Console.WriteLine("File Log:" + msg);
        }

        public void WriteLog(Exception ex)
        {
            Console.WriteLine("File Log:" + ex.StackTrace);
        }
    }
复制代码
复制代码
namespace UnityLib
{
    public interface IDataBase
    {
        void Add();
        void Delete();

        void Update();
        void Query();
    }
}
复制代码
复制代码
namespace UnityLib
{
    public class EFDataBase:IDataBase
    {
        public void Add()
        {
            Console.WriteLine("EF Add");
        }

        public void Delete()
        {
            Console.WriteLine("EF Delete");
        }

        public void Update()
        {
            Console.WriteLine("EF Update");
        }

        public void Query()
        {
            Console.WriteLine("EFUpdate");
            Console.WriteLine(" Query");
        }
    }
}
复制代码
复制代码
namespace UnityLib
{
    public class SQLServerDataBase:IDataBase
    {
        public void Add()
        {
            Console.WriteLine("SQLServer Add");
        }

        public void Delete()
        {
            Console.WriteLine("SQLServer Delete");
        }

        public void Update()
        {
            Console.WriteLine("SQLServer Update");
        }

        public void Query()
        {
            Console.WriteLine("SQLServer Query");
        }
    }
}
复制代码

 

配置文件:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
               Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity>
    <typeAliases>
      <typeAlias  alias="IDataBase" type="UnityLib.IDataBase,UnityLib" />
      <typeAlias  alias="EFDataBase" type="UnityLib.EFDataBase,UnityLib" />
      <typeAlias  alias="SQLServerDataBase" type="UnityLib.SQLServerDataBase,UnityLib" />
      <typeAlias  alias="ILog" type="UnityLib.ILog,UnityLib" />
      <typeAlias  alias="FileLog" type="UnityLib.FileLog,UnityLib" />
      <typeAlias  alias="ConsoleLog" type="UnityLib.ConsoleLog,UnityLib" />
    </typeAliases>
    <containers>
      <container name="DBcontainer">
        <type type="IDataBase" mapTo="EFDataBase" name="EF"></type >
        <type type="IDataBase" mapTo="SQLServerDataBase" name="SQLServer"></type >
      </container>
      <container name="LogContainer">
        <type type="ILog" mapTo="FileLog" name="file"></type>
        <type type="ILog" mapTo="ConsoleLog" name="console"></type>
      </container>
    </containers>
  </unity>
  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
</configuration>
复制代码

客户端代码:

复制代码
  class Program
    {
        static void Main(string[] args)
        {
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            var logContainer = new UnityContainer();
            var dbContainer = new UnityContainer();
            section.Configure(logContainer, "LogContainer");
            section.Configure(dbContainer, "DBcontainer");
            var log = logContainer.Resolve<ILog>("console");
            var db = dbContainer.Resolve<IDataBase>("EF");
            log.WriteLog("测试信息");
            db.Add();
        }
    }
复制代码

 以上是Unity框架的简单应用,代码没有深入研究,仅作为一个入门供大家参考。

注:以上是Unity3.X。。。

posted @   大侠的哥哥是菜鸟  阅读(2405)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2018-06-24 数据库使用 关键字 作为列名
2015-06-24 SQLServer导出导出单表数据
点击右上角即可分享
微信分享提示