该项目发起的初衷正如其名称(EasyWork)所述,旨在为开发人员节约更多的重复代码编写时间,可以更快乐的工作!
目前尚未开发完毕,主要精力暂时集中在:
Easy.Common
Easy.Domain
Easy.Plugin
Easy.ServiceLocator
Easy.ServiceLocator.Unity
[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方法将自动完成类型的注册,并且提供错误声明提示。
[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 个部分,即:插件定义,插件实现,插件处理
我们定义的插件,可以有参数和返回值,由于插件存在执行顺序的要求,所以我们可以用一个装饰模式来组合这些插件,使得之后对于增加或者删除插件,异或调整插件执行顺序等问题都变得简单
简单说就是定义一个接口,例如:只是简单的运行一些代码,没有参数,也没有返回值时,我们可以定义接口如下:
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 的程序集都将会执行自己的代码。