0

例如,我想调用以下代码来注册一整套我想为其注入策略的服务:

container
            .AddNewExtensionIfNotPresent<Interception>().Configure<Interception>().SetDefaultInterceptorFor<IBusinessService>(new InterfaceInterceptor());

在哪里:

ISomeServiceA  : IBusinessService
ISomeServiceB : IBusinessService etc 

我想我读到你不能从某个地方从 ISomeServceX 到 IMarkerInterface ......这可以得到证实。

4

1 回答 1

0

简而言之,查看加载的程序集(如果需要,添加额外的过滤 - 如果在引导程序上完成,则不进行缓存)为实现指定标记接口的类型添加默认拦截器。

        container.AddNewExtensionIfNotPresent<Interception>();
        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
        foreach (Assembly assembly in assemblies)
        {
            Type[] types = assembly.GetTypes().Where(x => x.IsClass && typeof(T).IsAssignableFrom(x) && x.GetType() != typeof(T)).ToArray();
            foreach (Type t in types)
            {
                container.Configure<Interception>().SetDefaultInterceptorFor(t, new VirtualMethodInterceptor());
            }
        }

编辑:

以上可以使用 fluent API 完成,这意味着我们没有对 AppDomain.CurrentDomain.GetAssemblies() 的天真依赖(它不包含在 fluent api 配置中应用的过滤

.Include(If.Implements<IBusinessService>, (x, y) =>
                                                          {
                                                              if (x.IsClass)
                                                                  y.Configure<Interception>().
                                                                      SetDefaultInterceptorFor(x,
                                                                                               new VirtualMethodInterceptor
                                                                                                   ());
                                                          })
于 2012-07-31T13:21:47.007 回答