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

查看所有标签

猜你喜欢:

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

Operating System Algorithms

Operating System Algorithms

Nathan Adams、Elisha Chirchir / CreateSpace Independent Publishing Platform / 2017-4-21 / USD 39.15

Operating System Algorithms will walk you through in depth examples of algorithms that you would find in an operating system. Selected algorithms include process and disk scheduling.一起来看看 《Operating System Algorithms》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

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

RGB CMYK 互转工具