问题标签 [unity-interception]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5475 浏览

unity-container - 使用接口拦截器按约定进行 Unity 注册导致“[type] 不可拦截”异常

WithMappings.FromMatchingInterface我想使用约定将所有实现特定接口的类注册到 Unity 中。此外,我希望使用接口拦截行为来拦截所有已注册的对象。问题是 Unity 还注册了具体类之间的映射,当这些类被解析时,会抛出异常并显示以下消息:

“[type] 不可拦截”

我意识到使用具体类类型解析对象不是最佳实践,但我想知道为什么 Unity 在按约定注册时会自动为接口 -> 具体类以及具体类 -> 具体类添加映射?这意味着如果您添加接口拦截器并使用具体类型进行解析,它将永远无法工作。

我想要的结果是 Unity 在按照约定注册并给它一个接口拦截器时没有添加具体类型 -> 具体类型映射,这样我们可以使用它的具体类型解析类,如果我们愿意,我们只需不被拦截。

我不想使用 ,VirtualMethodInterceptor因为我不想对类进行更改以使拦截起作用,这包括继承自MarshalByRef. 我还想避免单独注册所有对象。

因此,我的问题是,按惯例注册时如何仅注册接口映射?

更新:单独注册类会产生同样的问题,因此假设一旦一个对象注册了一个接口拦截器,那么它就不能通过使用具体类型来解决。

新注册码:

更新 2为所有接口添加默认拦截器似乎可行,尽管此解决方案相当 hacky。此解决方案需要在按约定进行标准注册之前的一些代码,并InterfaceInterceptor在基于约定的注册中删除。

预注册码

一些解释困境的代码:

0 投票
1 回答
1028 浏览

c# - IMethodInvocation 中的参数和输入之间的区别

Arguments集合和界面Inputs中的集合有什么区别?IMethodInvocation

两者都是IParameterCollection.

0 投票
1 回答
2815 浏览

asp.net-identity - ASP.NET Identity 2 - 注入 ISecureDataFormat<>

我在这里描述了同样的问题,没有答案,只是使用 Unity。

我正在尝试注册ISecureDataFormat<>最新的 VS2013(更新 2)SPA/Web Api 模板。

我试过了

它“有效”但不是真的,因为它抱怨该树中的下一个依赖关系,IDataSerializer ......然后是下一个 IDataProtector,我没有找到它的实现。

0 投票
1 回答
2064 浏览

c# - 接口的自动生成实现(没有类的代理)

我想要实现的是:

没有实现的地方IFooFactory- 因为它是由FactoryInterceptionBehavior.

但是,当我尝试解决此问题IFooFactory时,我收到一条ResolutionFailedException消息:

InvalidOperationException - 当前类型 IFooFactory 是一个接口,无法构造。您是否缺少类型映射?

我还考虑过自己创建代理(使用Intercept.ThroughProxy<>或城堡动态代理...),但我仍然需要对容器进行类型注册。我不知道如何委托/覆盖这种类型的实例化(如 Ninject 的Bind<IFoo>().ToMethod(() => return new Foo()))。

0 投票
1 回答
383 浏览

c# - unity interception from config without using container

Hi I am trying to use unity interception (I don't want to use unity container). I am able to configure run time but don't know how to configure it from config.

my code:

Behavior:

And this is how I am calling it

This is working. I need to configure this from config file. Please help

0 投票
1 回答
407 浏览

c# - 基于属性的属性拦截。如何?

我有一个实体的抽象类,负责为每个实体实例生成和返回唯一键。密钥生成有点昂贵,并且基于具体实体的属性值。我已经标记了参与密钥生成的属性,KeyMemberAttribute所以我需要做的就是在EntityBase.Key每次装饰有KeyMemberAttribute更改的属性时使 = null 。

所以,我得到了这样的基类:

然后我得到了如下实现的具体实体

每次属性值更改时,我都需要将其KeyMemberAttribute设置为EntityBase.Keynull

0 投票
1 回答
2547 浏览

c# - 在 Unity 中注册拦截实例

对于我的单元测试,我目前正在使用 Moq 模拟我的拦截器和拦截的类,然后在 Unity 中注册拦截的实例并为接口设置默认拦截器。然后我解析实例并调用拦截的方法,并验证正在调用拦截方法。

这很好用,但是我宁愿在注册期间设置拦截,就像我在注册服务/单例时一样,以保持一切一致。

我看不到任何使用该方法配置拦截的IUnityContainer.RegisterInstance()方法,因为它不需要任何InjectionMembers. 如果我UnityContainer.Configure<Interception>().SetDefaultInterceptorFor<T>()在解析之前调用,我实际上可以对实例使用拦截。

是否有更好/更简单的方法来注册或模拟拦截器?

0 投票
0 回答
121 浏览

vb.net - 延迟(延迟创建)或抑制 Unity 调用处理程序属性的创建,直到实际调用装饰方法

我正在尝试在我的接口(或实现)上使用拦截调用处理程序和处理程序属性。假设我的接口有两个方法 DoSomething() 和 DoSomethingElse(),而我只有 DoSomethingElse() 的拦截器;当我解析我的主界面时,调用处理程序的构造函数会被调用,即使我从未调用 DoSomethingElse()。

我通过解析到 Lazy(of IMainInterface) 来尝试这个,但是当我调用函数 DoSomething() 时,调用处理程序仍然是不必要的。有没有办法通过代码或配置来防止这种情况发生。这是我的示例实现

处理程序属性和调用处理程序

接口和实现

注册和执行方法的主模块

它产生以下输出:

在惰性解决
之前 在进行惰性函数调用
主类之前 - 构造
函数 普通样本属性的构造函数
创建处理
程序 样本调用处理程序

主类的构造函数 做一些事情......

尽管 DoSomethingElse() 从未被调用,但处理程序创建的成本被添加到所有流中。有没有办法避免这种情况?任何帮助表示赞赏。

提前致谢!SV

0 投票
1 回答
529 浏览

reflection - 如何使用 Log4Net 进行拦截(MS Unity)

我正在尝试将 Log4Net 与 Unity 和拦截一起使用......看起来一切都应该工作,但没有......我有两个问题......我认为有一个解决方案。当我登录文件时,我还应该记录我正在记录的方法。事实上,我有这样的配置:

在我拥有的模式中%M,这应该是我正在调用的方法......但我正在使用 Unity 拦截,因此,记录的方法名称是 INVOKE:

正是这种方法通过反射调用了我的真实方法。那么如何使用PatternLayoutlog4Net 解决这个问题呢?可能吗?我的第二个问题,我应该有两个不同的附加程序......我会创建一个名为MyNamespace.[MyClass].[MyMethod]

但这行不通,因为对于 log4net,我正在记录另一种方法,也就是说invoke,而不是我的真实方法。我希望一切都清楚。

任何人都可以帮助我吗?

谢谢

0 投票
1 回答
843 浏览

unity-container - Unity InterceptionBehavior 与 InjectionConstructor

是否可以使用 InjectionConstructor 配置自定义拦截行为?换句话说,你如何告诉 Unity 在你的 InterceptionBehavior 上使用哪个构造函数。

为了在我们的应用程序中跟踪方法流,我目前有四个处理跟踪的 InterceptionBehavior 类。它们之间的唯一区别是它们用于配置跟踪的 TraceSwitch,因此我们可以在不同的层中打开/关闭跟踪。我只想有一个自定义 TraceInterceptionBehavior,我可以使用 ConstructorInjection 来设置 TraceSwitches。

像这样的东西(仅示例,无法编译)。这就是我将业务服务注册到容器中的地方。其他层(例如控制器和存储库等)也会有类似的注册。

我试图调用的自定义 TraceInterceptionBehavior 的构造函数:

据我了解,如果使用旧 Unity 中的 PolicyInjection 和 CallHandler 是可能的,例如以下示例,但我不知道如何使用新版本的 Unity。

更新

正如下面@DanielJ.G 所指出的,拦截行为类可以像任何其他类一样注册到容器中。对于我希望使用不同的跟踪开关进行跟踪拦截的每一层,我只需为拦截行为设置一个命名注册。下面的代码将用于服务层。使用不同名称和 traceswitch 配置的控制器和存储库也有类似的注册。