Unity拦截行为未调用

时间:2016-02-22 11:51:43

标签: unity-container

在我的数据层中:

public interface IMyDataContext
{
    IMyRepository MyRepository { get ; set ; }
    // other repo's
}

public class MyDataContext : IMyDataContext
{
    public MyDataContext ( string connectionKey)
    {
        ConnectionKey = connectionKey;
        Database = new Database(ConnectionKey);
        MyRepository = new MyRepository (ConnectionKey);
        // other repo's
    }
}

在我的Web API服务层中:

在UnityConfig类中配置如此的统一:

_container = new UnityContainer();
_container.AddNewExtension<Interception>();

_container.RegisterType< IMyDataContext , MyDataContext >(
    new ContainerControlledLifetimeManager(),
    new Interceptor<InterfaceInterceptor >(),
    new InjectionConstructor("MyConnectionKey" )
);

我希望将审核行为添加到MyRepository接口,类似这样,

_container.RegisterType< IMyRespository, MyRepository >(
    new Interceptor<InterfaceInterceptor >(),
    new InterceptionBehavior<AuditingInterceptionBehaviour >()
);

如果我这样做的话,永远不会调用 AuditingInterceptionBehaviour 。让它在该repo上调用的唯一方法是在我的web api控制器的构造函数中解析(下面),但认为这不是解决它的最佳方法,并且在UnityConfig类中依赖于自动解析。

public MyController( IMyDataContext datacontext)
{
    _datacontext = datacontext;
    _datacontext.MyRepository = UnityConfig.Instance.Resolve<IMyRespository>       (new ParameterOverride("connectionKey", _datacontext.ConnectionKey));
}

如果我将行为添加到IMyDataContext的注册中,那么 AuditingInterceptionBehaviour 类会调用GET但我想获取调用存储库(在我的情况下是IMyRepository)而不是其父类的方法基本属性( IMyDataContext)。

这可以在我的UnityConfig课程中完成,还是我需要更多内容?

1 个答案:

答案 0 :(得分:0)

以为我会在这个问题上发表我的答案:

基本上,只需要加载服务层统一容器并解析数据层中的repo而不是Web API服务层,如下所示:

public class MyDataContext : IMyDataContext
{
    public MyDataContext ( string connectionKey)
    {
        ConnectionKey = connectionKey;
        Database = new Database(ConnectionKey);

        var container = new UnityContainer();
        container.LoadConfiguration();

        MyRepository = container.Resolve<IMyRespository>();
        // resolve other repo's
    }
}