This project is read-only.

项目描述

该项目发起的初衷正如其名称(EasyWork)所述,旨在为开发人员节约更多的重复代码编写时间,可以更快乐的工作!

目前尚未开发完毕,主要精力暂时集中在:

Easy.Common

Easy.Domain

Easy.Plugin

Easy.ServiceLocator

Easy.ServiceLocator.Unity

 

 

使用到的技术

  • ADO.NET
  • Entity Framework
  • Common Service Locator
  • Unity
  • Unity Interception Extension
  • MEF
  • Common.Logging & Log4Net
  • ASP.NET MVC 4
  • HTML5 UI framework => jQWidgets 与Kendo UI开发模式几乎一致,而且是免费的,有兴趣可访问:http://www.jqwidgets.com/

引用到的编程思想

  • DDD 领域驱动设计
  • CQRS 读写分离
  • IOC 控制反转
  • AOP 面向切面编程
  • Plugins 插件化开发

框架编程特性

  • 1. 支持 IOC 特性化类型注册声明 & 类型解析 & 自动类型注册

 

特性化类型注册声明

[RegisterType(typeof(Service), InterceptorType.Interface, IocLifeTime.New)]
public interface IService
{
       void Create(User user);

       void Update(User user);

       void Delete(Guid userId);
}

 

表示接口 IService 的具体实现为 Service
AOP拦截的类型为 Interface,容器的实例的生命周期为 New

 

类型解析

List<RegisterTypeInfo> results = RegisterTypeAnalyser.Analyze(Assembly.GetExecutingAssembly());

在当前程序集中调用:RegisterTypeAnalyser.Analyze(Assembly.GetExecutingAssembly());
即可获取当前程序集中声明的 RegisterType 特性注册信息

 

自动类型注册

EasyUnity.AutoRegisterType(results);

results 为上面获取到的注册特性,AutoRegisterType方法将自动完成类型的注册,并且提供错误声明提示。

 

 

  • 2. 支持 AOP 拦截

事务拦截特性声明

        [TransactionCallHandler]
     
   public void Create(Aut_Navigations aut_User)
        {
            _Aut_NavigationsBusiness.CreateNew(aut_User);
        }

 

事务拦截特性类

        public class TransactionCallHandlerAttribute : HandlerAttribute
        {
             public override ICallHandler CreateHandler(IUnityContainer container)
             {
                  return new TransactionCallHandler();
             }
        }

 

事务拦截处理程序

class TransactionCallHandler : ICallHandler
{
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
        {
            var methodReturn = getNext().Invoke(input, getNext);

            if (methodReturn.Exception == null)
            {
                transactionScope.Complete();
            }

            return methodReturn;
        }
    }

    public int Order { get; set; }
}

 

接口 ICallHandler 为 Unity.InterceptionExtension 的原生接口,实现拦截须继承该接口。

var methodReturn = getNext().Invoke(input, getNext); 表示执行被拦截的方法,执行完毕后,如过没有异常发生,那么就提交事务。

 

 

  • 3. 支持 Plugins 插件化开发

每个程序集可能都有一些需要在宿主程序启动时需要运行的一些代码,我们将插件化开发划分为 3 个部分,即:插件定义,插件实现,插件处理

我们定义的插件,可以有参数和返回值,由于插件存在执行顺序的要求,所以我们可以用一个装饰模式来组合这些插件,使得之后对于增加或者删除插件,异或调整插件执行顺序等问题都变得简单

 

插件定义:

简单说就是定义一个接口,例如:只是简单的运行一些代码,没有参数,也没有返回值时,我们可以定义接口如下:

 

 public interface IDefaultPlugin
 {
     void Run();
 }

 

 插件实现:

把上述接口分发给其他程序集,如果有哪些程序集想在宿主程序启动时运行,那么就实现接口IDefaultPlugin,代码如下:

[Export(typeof(IDefaultPlugin))]
public class DefaultPlugin : IDefaultPlugin
{
    public void Run()
    {
        //TODO:
    }
}

 

Export 是MEF框架的特性,旨在自动发现并导出类 DefaultPlugin 到 IDefaultPlugin 接口上

 

插件处理:

class DefaultPluginManager : PluginRootManager
{
    [ImportMany]
    IEnumerable<Lazy<IDefaultPlugin>> _defaultPlugins;

    //省略一些代码

    private void RunMe()
    {
        if (_defaultPlugins == null)
        {
            return;
        }

        foreach (var plugin in _defaultPlugins)
        {
            plugin.Value.Run();
        }
    }
}

 

ImportMany 是MEF框架的特性,旨在自动发现并获取接口 IDefaultPlugin 的所有实现

最后执行 plugin.Value.Run(),那么所有实现了接口 IDefaultPlugin 的程序集都将会执行自己的代码。

Last edited Mar 16 at 11:43 AM by hylsabella, version 12