勇哥注:
经过测试,在.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
版权声明:本文为博主原创文章,转载请附上博文链接!

