IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> 领域驱动设计 -> [Architect] Abp 框架原理解析(5) UnitOfWork -> 正文阅读

[领域驱动设计][Architect] Abp 框架原理解析(5) UnitOfWork

[Architect] Abp 框架原理解析(5) UnitOfWork 本节目录
介绍 分析Abp源码 实现UOW
介绍
UOW(全称UnitOfWork)是指工作单元.
在Abp中,工作单元对于仓储和应用服务方法默认开启。并在一次请求中,共享同一个工作单元.
同时在Abp中,不仅支持同一个数据库连接,还支持事务处理.
分析Abp源码
1.UnitOfWorkRegistrar

2.ComponentRegistered

3.IsConventionalUowClass

4.Intercept

5.PerformSyncUow
 

实现UOW
定义IUnitOfWork

    public interface IUnitOfWork
    {
        //1.开启事务
        //2.设置Filter(本例中不做演示)
        void Begin(UnitOfWorkOptions options);

        void Complete();
    }
    public class UnitOfWorkOptions
    {
        public bool? IsTransactional { get; set; }
    }

实现uow,在uow中会提供db的创建,这样才能管理到每个db.

    public class EfUnitOfWork : UnitOfWorkBase
    {
        public static DbContext DbContext { get; set; }

        public static DbContext GetDbContext()
        {
            if (DbContext == null)
            {
                DbContext = new DemoDb();
            }
            return DbContext;
        }

        public override void Begin(UnitOfWorkOptions options)
        {
            if (options.IsTransactional == true)
            {
                CurrentTransaction = new TransactionScope();
            }
        }

        public TransactionScope CurrentTransaction { get; set; }

        public override void Complete()
        {
            SaveChanges();
            if (CurrentTransaction != null)
            {
                CurrentTransaction.Complete();
            }
        }

        private void SaveChanges()
        {
            DbContext.SaveChanges();
        }
    }
    public abstract class UnitOfWorkBase : IUnitOfWork
    {
        public virtual void Begin(UnitOfWorkOptions options)
        {
        }

        public virtual void Complete()
        {
        }
    }

定义与实现仓储层,这里不再做DbProvider.

    public interface IRepository
    {

    }

    public interface ITaskRepository : IRepository
    {
        void Add(Task task);
    }

    public class TaskRepository : ITaskRepository
    {
        public void Add(Task task)
        {
            var db = (DemoDb)EfUnitOfWork.GetDbContext();
            db.Tasks.Add(task);
        }
    }

定义与实现应用层

    public interface IApplicationService
    {

    }

    public interface ITaskAppService : IApplicationService
    {
        void CreateTask(CreateTaskInput input);
    }

    public class TaskAppService : ITaskAppService
    {
        private ITaskRepository _repository;
        public TaskAppService(ITaskRepository repository)
        {
            _repository = repository;
        }
        public void CreateTask(CreateTaskInput input)
        {
            _repository.Add(new Task(input.Name));
        }
    }

    public class CreateTaskInput
    {
        public string Name { get; set; }
    }

定义与实现uow拦截器

    internal class UnitOfWorkInterceptor : IInterceptor
    {
        private IUnitOfWork _unitOfWork;
        public UnitOfWorkInterceptor(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
        public void Intercept(IInvocation invocation)
        {
            _unitOfWork.Begin(new UnitOfWorkOptions());
            invocation.Proceed();
            _unitOfWork.Complete();
        }
    }

定义在IApplicationService与IRepository接口下拦截

        static void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler)
        {
            var type = handler.ComponentModel.Implementation;
            if (typeof(IApplicationService).IsAssignableFrom(type) || typeof(IRepository).IsAssignableFrom(type))
            {
                handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(UnitOfWorkInterceptor)));
            }
        }

执行

        static void Main(string[] args)
        {
            using (var container = new WindsorContainer())
            {
                container.Register(Component.For<IInterceptor, UnitOfWorkInterceptor>());//先注入拦截器
                container.Register(Component.For<IUnitOfWork, EfUnitOfWork>());
                container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
                container.Register(Component.For<ITaskAppService, TaskAppService>());
                container.Register(Component.For<ITaskRepository, TaskRepository>());
                var person = container.Resolve<ITaskAppService>();
                person.CreateTask(new CreateTaskInput() { Name = "3333" });
            }
            Console.ReadKey();
        }

会自动在application method的结尾调用Complete.
另外也可以在uow上定义option为启用事务.在本例中稍作扩展即可实现.
本文地址:http://neverc.cnblogs.com/p/5263558.html
上一篇文章      下一篇文章      查看所有文章
加:2016-03-14 23:40:03  更:2017-05-16 03:46:33 
 
  领域驱动设计 最新文章
领域驱动设计的基础知识总结
海西 · 云交付 DevOps实践落地方案
多服务器终端交互利器
《静儿的服务治理私房菜》服务治理和架构
服务治理概述
美团.点评服务治理框架
ASP.NET Zero
1.领域驱动简介.2.领域.子域.限界上下文.3.
东麓庄园系统开发
东麓庄园系统开发
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2019年6日历
2019-6-25 0:28:31
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库