少有人走的路

勇哥的工业自动化技术网站

.net framework和.net Core都可以用的Unity依赖注入框架的演示

勇哥注:

经过测试,在.net8.0下,用vs2022引用Unity5.11最新版本的包,是没有问题的。功能上至少基本di功能是没有问题的。



Unity的di演示


注意下面MyController器的构造函数中,两个参数是由框架注入的对象。

MyController的构造只管要对象,至于是谁传入的对象、这个对象具体是个什么东西MyController是不知道的,都是由框架决定的。


源码:

using Unity;
using Unity.Lifetime;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var container=new UnityContainer();
            container.RegisterType<MyController, MyController>();
            container.RegisterType<ILog,MyLog>();
            container.RegisterType<IConfig,MyConfig>();
            container.RegisterType<IStorage,MyStorage>();

            var myclass = container.Resolve<MyController>();
            myclass.Test();
        }
    }

    public class MyController
    {
        private readonly ILog log;
        private readonly IStorage storage;

        public MyController(ILog log, IStorage storage)
        {
            this.log = log;
            this.storage = storage;
        }

        public void Test()
        {
            log.Log("开始连接数据库");
            storage.Save();
            log.Log("关闭数据库连接");
        }
    }

    public interface ILog
    {
        void Log(string message);
    }

    public class MyLog : ILog
    {
        public void Log(string message)
        {
            Console.WriteLine(message);
        }
    }

    public interface IConfig
    {
        string Read(string message);
    }

    public class MyConfig : IConfig
    {
        public string Read(string message)
        {
            return $"从文件读取的配置项[{message}]";
        }
    }

    public interface IStorage
    {
        void Save();
    }

    public class MyStorage : IStorage
    {
        private readonly IConfig config;
        public MyStorage(IConfig config)
        {
            this.config = config;
        }

        public void Save()
        {
            Console.WriteLine("文件存储成功");
        }
    }
}



关于Unity的几个要注意的问题

(1)如果像下面这样写会报错。

Unity中如果你注册类和它的实例时用了命名,则不可以使用ResolvAll<T>进行解析(它只能用于未命名的注册类)。

你必须使用Resolv<T>解析。

container.RegisterType<DockContent, AddHardwareForm>("AddHardwareForm");
container.RegisterType<DockContent, PgAxisPrameterForm>("PgAxisPrameterForm");


container.ResolveAll<DockContent>();



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864