AY Github项目学框架技巧-CommonServiceLocator

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

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

查看所有标签

猜你喜欢:

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

智慧社会

智慧社会

阿莱克斯·彭特兰 (Alex Pentland) / 汪小帆、汪容 / 浙江人民出版社 / 2015-4 / CNY 56.90

●如果要在大数据领域推举出一个代表性的科学家,阿莱克斯·彭特兰是一个无法令人忽略的名字。经过数年极具开创性的研究,社会物理学这个全新科学领域的根基已足够深厚。社会物理学是关于想法流的科学,正是在想法流的帮助下,我们才得以提高集体智能,促进智慧社会的形成。 ● 通过研究数以百万计的人在智能手机、GPS设备、互联网等地方留下的“数字面包屑”,大数据的应用已成为一股无法被忽视的力量。在大数据的应用......一起来看看 《智慧社会》 这本书的介绍吧!

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

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具