Mini 容器学习笔记6——组件的获取(应用)
1. 通过组件Id获取组件实例:
[Test] public void GetByIdTest() { ServiceRegistry.Register<Person>("person"); var person = ServiceLocator.Get<IPerson>("person"); Assert.IsTrue(person != null); var person2 = ServiceLocator.Get<Person>("person"); Assert.IsTrue(person2 != null); Assert.AreSame(person, person2); Assert.IsTrue(Person.HasVisited); }
[Test] public void GetByTypeTest() { ServiceRegistry.Register<Person>(); var person = ServiceLocator.Get<IPerson>(); Assert.IsTrue(person != null); var person2 = ServiceLocator.Get<IPerson,Person>(); Assert.IsTrue(person2 != null); Assert.AreSame(person, person2); Assert.IsTrue(Person.HasVisited); }
[Contract] interface IPerson { string Name { get; set; } } class Person : IPerson { public string Name { get; set; } public static bool HasVisited; public Person() { HasVisited = true; } } [Contract] interface IHorse { } [Component] class RedHorse : IHorse { } class BlackHorse : IHorse { } class Person2 : IPerson { public string Name { get; set; } public IHorse Horse { get; set; } public Person2(IHorse horse) { Horse = horse; } public Person2() { } } [Test] public void GetAllTest() { ServiceRegistry .Register<Person>() .Register(typeof(Person2)); var person = ServiceLocator.Get<IPerson>(); Assert.IsTrue(person != null); Assert.IsTrue(typeof(IPerson).IsAssignableFrom(person.GetType())); var items = ServiceLocator.GetAll<IPerson>().ToArray(); Assert.IsTrue(items.Length == 2); Assert.IsTrue(items[0] is Person); Assert.IsTrue(items[1] is Person2); }
[Contract] interface IParameterConstructorInterface { int Id { get; } string Name { get; } IPerson Person { get; } } class ParameterConstructorClass : IParameterConstructorInterface { public int Id { get; private set; } public string Name { get; private set; } public IPerson Person { get; private set; } public ParameterConstructorClass(int id, string name, IPerson person) { Id = id; Name = name; Person = person; } }
//传递数组的方式
[Test] public void NeedParameterConstructorTest() { var person = new Person(); ServiceRegistry.Register<ParameterConstructorClass>(); var instance = ServiceLocator.Current.Get(typeof(IParameterConstructorInterface), 10, "ZhangSan", person) as IParameterConstructorInterface; Assert.IsNotNull(instance); Assert.IsNotNull(instance); Assert.AreEqual(10, instance.Id); Assert.IsTrue("ZhangSan"== instance.Name); Assert.AreSame(person, instance.Person); }
//传递命名参数字典 [Test] public void NeedNamedParameterConstructorTest() { var ps = new Dictionary<string, object>(); var person = new Person(); ps["id"] = 10; ps["name"] = "ZhangSan"; ps["person"] = person; ServiceRegistry.Register<ParameterConstructorClass>(); var instance = ServiceLocator.Current.Get(typeof(IParameterConstructorInterface), ps) as IParameterConstructorInterface; Assert.IsNotNull(instance); Assert.AreEqual(10, instance.Id); Assert.IsTrue("ZhangSan" == instance.Name); Assert.AreSame(person, instance.Person); }
Mini 容器官方网站:
推荐资源:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架