【问题标题】:[Castle.DynamicProxy]The created proxy object does not have properties of original object set correctly[Castle.DynamicProxy]创建的代理对象没有正确设置原始对象的属性
【发布时间】:2017-12-13 16:21:09
【问题描述】:

我是新来的,希望我的第一个问题不会让任何人感到困惑。

我正在同时使用 Castle Windsor 和 Castle DynamicProxy,以便将 AOP 与 IOC 集成,这样我就可以实现一个日志服务(和审计等),它将拦截我项目中的所有服务。

我正在尝试代理已解析的实例以完成此操作,但没有运气。因为返回的代理会将已解析实例的属性设置为 null。以下是调试信息供参考(PROBLEMATIC 属性为 TimeService)。

the resolved instance before proxied

代理前解析的实例。

the proxied object

代理对象

我是否遗漏了什么,或者我对 Castle DynamicProxy 的理解有误?我确实搜索了任何解决方案,但没有运气。

非常感谢任何答案。提前致谢。

【问题讨论】:

    标签: inversion-of-control castle-windsor castle castle-dynamicproxy


    【解决方案1】:

    您应该在注册期间使用 Windsor 对 AOP 的内置支持,而不是覆盖 WindsorContainer.Resolve 否则您还会遇到有关发布组件和容器生命周期的其他问题:

    container.Register(
        Component.For<ICalcService>()
            .Interceptors(InterceptorReference.ForType<ReturnDefaultInterceptor>()).Last,
        Component.For<ReturnDefaultInterceptor>()
    );
    

    有关更多信息,请参阅文档:https://github.com/castleproject/Windsor/blob/master/docs/registering-interceptors-and-proxyoptions.md

    【讨论】:

    • 非常感谢您的回答,这对我有用。还有一个问题,似乎此解决方案需要为每个组件配置拦截器(在代码或配置文件中),有没有一种方法可以指定某种自动应用于所有组件的全局拦截器?
    • @SkyFeng 如果您不使用约定驱动的注册(例如 Classes.FromAssemblyContaining()),则挂钩容器。 ComponentRegistered 并添加到 ComponentModel.Interceptors。
    • 知道了。非常感谢。 @jonathon-rossi
    • @SkyFeng 如果您发现您想做的不仅仅是添加一个拦截器,您可能希望将逻辑分离到 Windsor 工具(例如 Windsor 的 LoggingFacility)或实现简单的 IContributeComponentModelConstruction 接口。
    • 非常感谢您的好意,它肯定会帮助我的学习。我是 Castle 的新手,还有很多东西要学(因为 Castle 提供了很多有用的工具)。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2012-10-02
    相关资源
    最近更新 更多