【问题标题】:Setter injection on an existing service instance in Castle Windsor在 Castle Windsor 中现有服务实例上的 Setter 注入
【发布时间】:2010-10-19 08:39:36
【问题描述】:

Castle Windsor 是否支持将 setter 注入应用到现有服务实例?我有一个案例,我无法控制某些类实例的创建,而我确实需要解决它们的依赖关系。这排除了构造函数注入,但为 setter 注入打开了大门,因为我可以在新实例创建后立即拦截它们。

我知道 Castle Windsor 支持开箱即用的 setter 注入,我只是不知道它是否可能(如果是的话:如何)在不使用 Resolve 方法的情况下显式地利用它。

我也知道这样的事情在 StructureMap 中是可能的,使用 ObjectFactory.BuildUp 方法,这提高了我在温莎城堡中找到等价物的希望。

如果您想知道,我正在对 ASP.NET WebForms 中的页面应用依赖注入,提供自定义 PageHandlerFactory。我不想自己尝试创建页面处理程序,我应该把它留给PageHandlerFactory 类中的基本实现。

public class CustomPageHandlerFactory : PageHandlerFactory
{
    public override IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)
    {
        IHttpHandler handler = base.GetHandler(context, requestType, virtualPath, path);
        Page page = handler as Page;

        if (page == null)
        {
            return handler;
        }

        // Resolve dependencies using setter injection...

        return page;
    }
}

【问题讨论】:

    标签: c# .net dependency-injection castle-windsor


    【解决方案1】:

    见本文底部:

    http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/

    Jeremy 为实现属性注入的 Windsor Container 提供了一个扩展方法。

    【讨论】:

    • 谢谢。提供的代码实现了注入,而不是将其留给 Windsor,并且由于反射代码和没有缓存机制,性能不是很好。不过,我会将它作为临时解决方案粘贴到我的代码库中,直到我有一个更优雅的解决方案。
    【解决方案2】:

    Castle Windsor 是否支持将 setter 注入应用到现有服务实例?

    没有。查看FAQ 了解基本原理。

    我正在对 ASP.NET WebForms 中的页面应用依赖注入,

    this question

    【讨论】:

    • 我明白了。我正在考虑编写一个使用惰性组件加载器进行设置器注入的工具。我知道这有点臭,但我认为在使用 ASP.NET WebForms 时这是不可避免的。
    【解决方案3】:

    查看尼尔肖恩的ASpNetWindsorModule

    【讨论】:

    • 谢谢,那个模块真漂亮!
    • 我只希望它支持用户控件的 setter 注入。
    • 它确实支持这一点。只有当您自己使用 LoadControl() 时,它才会 OOTB。
    • 这确实是我正在使用的。包装 LoadControl 很快解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多