我正在尝试使用本文中的方法在asp.net mvc应用程序中的存储库层实现审计:
http://msdn.microsoft.com/en-us/magazine/dn574804.aspx
问题是我有2个数据库,1个MarkLogic和1个MySQL,每个都有自己的存储库接口,但是我需要使用我们在审计到MySQL的业务层中的_loggingService来审计这两个存储库数据库。 (不要问)。
我们也使用ninject进行DI。
这是我的AuditProxy类:
public class AuditProxy<T> : RealProxy
{
private readonly T _decorated;
public AuditProxy(T decorated) : base(typeof(T))
{
_decorated = decorated;
}
private void Audit(string msg, object arg = null)
{
//TODO: Replace with service call to Audit table
Debug.WriteLine(msg, arg);
}
public override IMessage Invoke(IMessage msg)
{
var methodCall = msg as IMethodCallMessage;
var methodInfo = methodCall.MethodBase as MethodInfo;
Audit("In Audit Proxy - Before executing '{0}'",
methodCall.MethodName);
try
{
var result = methodInfo.Invoke(_decorated, methodCall.InArgs);
Audit("In Audit Proxy - After executing '{0}' ",
methodCall.MethodName);
return new ReturnMessage(result, null, 0,
methodCall.LogicalCallContext, methodCall);
}
catch (Exception e)
{
Audit(string.Format(
"In Audit Proxy- Exception {0} executing '{1}'", e),
methodCall.MethodName);
return new ReturnMessage(e, methodCall);
}
}
}
如果我进入我的服务层并执行以下操作,审计代理将按预期运行:
private readonly IMarkLogicRepository _markLogicRepository;
public SomethingService(IMarkLogicRepository<AnObject> markLogicRepository)
{
_markLogicRepository = Create<IMarkLogicRepository<AnObject>>();
}
public static IMarkLogicRepository<AnObject> Create<T>()
{
var repository = new MarkLogicRepository<AnObject>();
var auditProxy = new AuditProxy<IMarkLogicRepository<AnObject>>(repository);
return auditProxy.GetTransparentProxy() as IMarkLogicRepository<AnObject>;
}
...etc
我的奋斗是,如何将代码抽象出来,以便每当我进入服务层并使用:
私有只读IMarkLogicRepository或私有只读IMySQLRepository,他们已经知道代理,它已经绑定并准备好了,每次调用这些存储库方法时都会发生审计?
如果有人可以提供彻底的解决方案并且我可以开始工作,我愿意在比特币中捐出一些啤酒钱,好像我们无法采用AOP风格的方法来完成这项工作,我将不得不进入服务层并逐行添加审计我们想要审计的每个方法,我真的厌倦了编写代码的方式,但似乎找不到任何人向我解释“正确”在复杂的项目中做这些事情的方法......
感谢。