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


少有人走的路


















