将服务层审计注入多个存储库?

时间:2014-04-01 21:18:55

标签: c# oop ninject repository-pattern aop

我正在尝试使用本文中的方法在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风格的方法来完成这项工作,我将不得不进入服务层并逐行添加审计我们想要审计的每个方法,我真的厌倦了编写代码的方式,但似乎找不到任何人向我解释“正确”在复杂的项目中做这些事情的方法......

感谢。

0 个答案:

没有答案