内容简介:简单复习一个实例管理 https://github.com/unitycontainer/commonservicelocator因为做图形有很多对象,需要一个对象管理器,作为一个服务定位(就是获得实现接口的实例的一个类),以前用IOC,这里ay教大家实现一个统一行为的自己实现抽象 的对象管理,怎么拿对象内部自己实现的,我们只提供对外统一的约定。
简单复习一个实例管理 https://github.com/unitycontainer/commonservicelocator
因为做图形有很多对象,需要一个对象管理器,作为一个服务定位(就是获得实现接口的实例的一个类),以前用IOC,这里
ay教大家实现一个统一行为的自己实现抽象 的对象管理,怎么拿对象内部自己实现的,我们只提供对外统一的约定。
如果纯IOC,注册啊,获得的没意思了。
架构师的就是要 开放封闭原则,接口,抽象类,父类,各种访问修饰符,设计模式到处用。
设计玩法给下面的人玩。
本期架构术语:Mock+类名的命名的方式命名类,经常听Mock测试,被它修饰,代表这个类将会被测试
这个测试的目的:(1)验证方法调用,怎么调用的,什么参数等;
(2)指定某个方法的返回值,或者是执行特定的动作
Constants命名一个类,代表常量类,里面定义一批常量
AY就是从各种github项目学习和提升的。
新建一个wpf项目 4.5Framework
引用
描述自己是一个IOC的抽象,服务定位
源码很少,6个文件,很轻量。
新建一个接口和2个服务对象(接口的实现)测试用的
public interface ILogger { void Log(string msg); } public class AdvancedLogger : ILogger { public void Log(string msg) { } } public class SimpleLogger : ILogger { public void Log(string msg) { Console.WriteLine("simplelogger:"+msg); } }
加一个mock类,当然我这个项目是wpf的,不是单元测试,可加mock前缀,也可以不加。
using CommonServiceLocator; using System; using System.Collections.Generic; using System.Linq; namespace Test20190507 { public class MockServiceLocator : ServiceLocatorImplBase { private readonly IEnumerable<object> _objects; public MockServiceLocator(IEnumerable<object> list) { _objects = list; } protected override object DoGetInstance(Type serviceType, string key) { return null == key ? _objects.First(o => serviceType.IsAssignableFrom(o.GetType())) : _objects.First(o => serviceType.IsAssignableFrom(o.GetType()) && Equals(key, o.GetType().FullName)); } protected override IEnumerable<object> DoGetAllInstances(Type serviceType) { return _objects.Where(o => serviceType.IsAssignableFrom(o.GetType())); } } }
看似很简单的一个类。
测试实例,第一步放对象到列表集合去,第二步获得对象,从对象池查找
IServiceLocator locator = new MockServiceLocator(new object[] { new SimpleLogger(), new AdvancedLogger(), new NullReferenceException() }); ILogger instance = locator.GetInstance<ILogger>(); instance.Log("测试1"); ILogger instance2 = locator.GetInstance<ILogger>(typeof(AdvancedLogger).FullName); instance2.Log("测试2");
框架提供了一个对 使用者的接口,封闭了具体的实现和调用,利用模板模式,把如何获得,查找定位对象的 方法暴露给 使用者。
我们实现了一个简单的对象查找。
当然,作为ioc,还需要 管理生命周期,具体的后面再看。
初始化东西
ServiceLocator.SetLocatorProvider(null);
ServiceLocator.SetLocatorProvider(() => new MockServiceLocator(null));
Console.WriteLine(ServiceLocator.IsLocationProviderSet);
var currentServiceLocator = ServiceLocator.Current;
在这个demo叫ServiceLocator
其他的ioc有时候也叫Container,服务容器,管理对象池的,当然这里 跟 享元模式还是像的。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
感兴趣的自己可以研究学学别人的设计,有时候挺好玩的。
AY 这篇讲完了。
推荐您阅读更多有关于“C#,”的文章
以上所述就是小编给大家介绍的《AY Github项目学框架技巧-CommonServiceLocator》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- express 框架一些渗透技巧
- AY Github项目学框架技巧-Visual Studio 标准类库
- 渗透技巧之Powershell实战技巧
- 渗透技巧——快捷方式文件的参数隐藏技巧
- Python实用技巧,你不知道的7个好玩的Python技巧
- Python 技巧总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。