AY Github项目学框架技巧-CommonServiceLocator

栏目: 后端 · 发布时间: 5年前

内容简介:简单复习一个实例管理 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

AY Github项目学框架技巧-CommonServiceLocator

引用

AY Github项目学框架技巧-CommonServiceLocator

描述自己是一个IOC的抽象,服务定位

源码很少,6个文件,很轻量。

AY Github项目学框架技巧-CommonServiceLocator

新建一个接口和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");

AY Github项目学框架技巧-CommonServiceLocator

框架提供了一个对 使用者的接口,封闭了具体的实现和调用,利用模板模式,把如何获得,查找定位对象的 方法暴露给 使用者。

我们实现了一个简单的对象查找。

当然,作为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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深度学习框架PyTorch:入门与实践

深度学习框架PyTorch:入门与实践

陈云 / 电子工业出版社 / 2018-1 / 65

《深度学习框架PyTorch:入门与实践》从多维数组Tensor开始,循序渐进地带领读者了解PyTorch各方面的基础知识。结合基础知识和前沿研究,带领读者从零开始完成几个经典有趣的深度学习小项目,包括GAN生成动漫头像、AI滤镜、AI写诗等。《深度学习框架PyTorch:入门与实践》没有简单机械地介绍各个函数接口的使用,而是尝试分门别类、循序渐进地向读者介绍PyTorch的知识,希望读者对PyT......一起来看看 《深度学习框架PyTorch:入门与实践》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具