仓储设计模式和容器

  最近研习了一下公司的框架,挺简单的其实就是一个容器和一个仓储,所有的service对象都是放在容器中,而且容器中只会保存一份该对象,也有解耦的作用。下面是一个精简的框架。

首先定义一个容器的接口.

namespace mycontainer.factory
{
    public interface IContainer
    {
        /// <summary>
        /// 往容器中注册对象
        /// </summary>
        /// <typeparam name="TRepository"></typeparam>
        /// <param name="factory"></param>
        void Register<TRepository>(Func<TRepository> factory);
        /// <summary>
        ///  从容器中获取对象
        /// </summary>
        /// <typeparam name="TRepository"></typeparam>
        /// <returns></returns>
        TRepository Resolve<TRepository>();
    }
}

定义一个容器实现该接口

namespace mycontainer.factory
{
    internal class Container : IContainer
    {
        private readonly ConcurrentDictionary<Type, object> _factories;

        public Container()
        {
            _factories=new ConcurrentDictionary<Type, object>();
        }

        public void Register<TRepository>(Func<TRepository> factory)
        {
            Type key = typeof (TRepository);
            _factories[key] = factory;
        }

        public TRepository Resolve<TRepository>()
        {
            object factory;
            if(_factories.TryGetValue(typeof(TRepository),out factory))
            {
                return ((Func<TRepository>) factory)();
            }
            throw new ArgumentException("************没有注册该对象***********");
        }
    }
}

ConcurrentDictionary字典是线程安全的,在某些特定的时候性能也比较好,所以我们用这个对象作为service对象容器

namespace mycontainer.factory
{
    public class ContainerLocator
    {
        private static  ContainerLocator _instance=new ContainerLocator();
        /// <summary>
        /// 容器的一个接口
        /// </summary>
        private IContainer _container;

        public static IContainer Container
        {
            get { return _instance._container; }
        }
        /// <summary>
        /// 容器加载的一个实例对象
        /// </summary>
        public static ContainerLocator Instance
        {
            get { return _instance; }
        }

        private ContainerLocator()
        {
            _container=new Container();
            RegisterDefaults(_container);
        }
        /// <summary>
        /// 进行对象注册
        /// </summary>
        /// <param name="_container"></param>
        private void RegisterDefaults(IContainer _container)
        {
           _container.Register<IEnglish>(()=>new English());
        }
    }
}

接下来是仓储层,仓储层里面这样是接口和一些接口的代码实现,一定要记住哪层做哪层的事,千万不能弄串了,不然后期维护会很费劲

一个简单的接口

namespace mycontainer.Repositories
{
   public interface IBase
   {
       string ShowHi();
    }
}

这个是基接口,所有接口的通用的方法定义就写在这个里面,

下面是各个数据访问层对象的接口,这里就给个简单的空接口和接口的实现

namespace mycontainer.Repositories
{
    public interface IEnglish:IBase
    {
    }
}
namespace mycontainer.Repositories
{
    public class English:IEnglish
    {
        public string ShowHi()
        {
            return "Hello !!!";
        }
    }
}

嗯,仓储层就写好了,这里框架简单,可以认为就是一个数据访问层,接下来就是最后的服务层,也叫业务逻辑层

namespace mycontainer.service
{
    public class HelloService
    {
        private readonly IEnglish english;

        public HelloService()
        {
            english = ContainerLocator.Container.Resolve<IEnglish>();
        }

        public string SayHi()
        {
            return english.ShowHi();
        }
    }
}

这样一个简单的框架就完成了,虽然仓储层写的简单,如果以后系统复杂,仓储层可以就行很好的扩展

namespace service
{
    class Program
    {
        static void Main(string[] args)
        {
            HelloService service = new HelloService();
            string str = service.SayHi();
            Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}

下载 http://files.cnblogs.com/dongqinglove/MyContainer.rar

仓储设计模式和容器

时间: 2024-11-12 04:28:18

仓储设计模式和容器的相关文章

从匿名函数(闭包特性)到 PHP 设计模式之容器模式

匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并赋值给一个变量,通过变量名调用这个匿名函数 */ $anonFunc = function($param){ echo $param; }; $anonFunc('这里是一个匿名函数'); // 通过变量名调用匿名函数,和普通函数没什么区别 /* 示例二:通过在函数内部使用匿名函数动态创建函数 */

从零开始入门 K8s| 详解 Pod 及容器设计模式

作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 一.为什么需要 Pod 容器的基本概念 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单位,但是为什么我们会需要这样一个概念呢?在使用容器 Docker 的时候,也没有这个说法.其实,如果想要理解 Pod,首先要理解容器,所以来回顾一下容器的概念: 容器的本质实际上是一个进程,是一个视图被隔离,资源受限的进程. 容器里面 PID=1 的进程就是应用本身,这意味着管理虚拟机等于管理基础设

java容器---集合总结

思考为什么要引入容器这个概念? Java有多种方式保存对象(应该是对象的引用),例如使用数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定尺寸的,你必须事先知道你要需要多少个对象.但是在一般的情况中,你在写程序中并不知道将需要多少个对象,或者是否需要更加复杂的方式来存储对象,因此数组尺寸固定很不爽! 为了解决上述问题,引入了容器的概念.容器提供了完善的方法来保存对象,你可以使用这些工具来解决数量惊人的问题.Java容器类可以自动调整自

【设计模式与Android】迭代器模式——容器遍历,细节隐藏

什么是迭代器模式 所谓迭代器模式,就是提供一种方法顺序访问一个容器对象的各个元素,而又不需要暴露该对象的内部表示的设计模式. 迭代器模式的实现方式   在客户访问类与容器体之间插入一个第三者--迭代器,就可以在不暴露该对象的内部表示的同时解决容器类承担提供遍历方法功能造成功能冗余的问题. <水浒传>中"梁山泊全伙受招安"的时候,宋江给梁上好汉造了天罡地煞两个花名册(容器).先定义一个容器接口: public interface Company { Iterator iter

为什么我们需要Pod?(容器设计模式sidecar)

Pod,是 Kubernetes 项目中最小的 API 对象 容器的本质是进程,就是未来云计算系统中的进程:容器镜像就是这个系统里的".exe"安装包 Kubernetes 就是操作系统! Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volum 所以, 在 Kubernetes 项目里,Pod 的实现需要使用一个中间容器,这个容器叫作 Infra 容器.在这个 Pod 中,Infra 容器永远都是第一个被创建的容器,而其他用户定义的

React 设计模式 --- Container and Presentational pattern(容器和展示组件分离)

在React开发中,一个典型的React组件通常会混杂着逻辑操作部分和展示部分.逻辑操作部分指的是和页面UI无关的内容,如API的调用,数据的处理,事件处理函数. 展示部分则指的是创建页面UI 的内容,就是组件中render 函数的内容. 简单地写一个组件Geo 来看一下,这个组件会展示我们的位置信息.为了简单起见,用create-react-app创建项目.项目中的src目录主要存放源代码,所以我们在其内部新建一个目录components, 用于存放我们的组件.一般我们直接写js 文件,暴露出

浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象

最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应的页面响应操作,在每一个类的构造方法中都传入了主类的引用,在主类中提供了所有类的get()方法,这样的做法显得十分的臃肿,就像这样: 打开主页面后会显示窗体B,窗体B的按钮支持我们打开窗体A,窗体A按钮支持修改B中属性.我们只能通过在主页面的类中使用get(),set()方法来持有A和B的引用,在A

设计模式课程 设计模式精讲 8-9 单例设计模式-容器模式

1 课程讲解 1.1 应用场景 2 代码演练 1.1 容器单例 1 课程讲解 1.1 应用场景 应用于在程序初始化的时候把多个单例对象放入到singletonMap中,使用的时候直接通过key获取对象.可以应用在懒汉模式中,不适用于饿汉模式(饿汉模式由于每次都要重新初始化会出现多线程安全问题) 使用hashtable会线程安全,但是由于其同步锁,会影响性能. 2 代码演练 1.1 容器单例 test类: package com.geely.design.pattern.creational.si

6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-dep/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig