当前位置:网站首页 / C#人爱学不学 / 正文

AY Github项目学框架技巧-CommonServiceLocator

时间:2019年05月07日 | 作者 : aaronyang | 分类 : C#人爱学不学 | 浏览: 961次 | 评论 0

简单复习一个实例管理 https://github.com/unitycontainer/commonservicelocator

因为做图形有很多对象,需要一个对象管理器,作为一个服务定位(就是获得实现接口的实例的一个类),以前用IOC,这里

ay教大家实现一个统一行为的自己实现抽象 的对象管理,怎么拿对象内部自己实现的,我们只提供对外统一的约定。

如果纯IOC,注册啊,获得的没意思了。


架构师的就是要 开放封闭原则,接口,抽象类,父类,各种访问修饰符,设计模式到处用。

设计玩法给下面的人玩。


本期架构术语:Mock+类名的命名的方式命名类,经常听Mock测试,被它修饰,代表这个类将会被测试

这个测试的目的:(1)验证方法调用,怎么调用的,什么参数等;

                            (2)指定某个方法的返回值,或者是执行特定的动作

Constants命名一个类,代表常量类,里面定义一批常量

AY就是从各种github项目学习和提升的。


新建一个wpf项目 4.5Framework

image.png

引用

image.png

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

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

image.png


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

image.png


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

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


当然,作为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#,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2017/2019,最新AYUI:7.6.5.5

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表