【问题标题】:Dependency injection using Castle Windsor in HTML Helpers在 HTML Helpers 中使用 Castle Windsor 进行依赖注入
【发布时间】:2012-05-23 12:34:17
【问题描述】:

所以,我正在做基于 .NET MVC 3 的应用程序并使用 Castle Windsor 作为 IOC 容器。

我使用它没有任何问题并且工作得很好。现在我遇到了这种情况,我创建了一个公开方法的 HTML 助手

public static string GetContentByKey(string key)
{
     //I need to use a service that is resolved by Windsor here
}

问题是在这个 Helper 类中我需要使用一个通过 Windsor 初始化的服务,但是由于这个 Helper 是一个静态方法,所以你没有构造函数注入的选项。

【问题讨论】:

  • 这种问题表明您正在尝试使用错误的方法。也许您应该退后一步,重新考虑您要做什么。
  • 我同意塞巴斯蒂安的观点。如果一个类需要依赖,它可能不仅仅是一个“帮助”类。就像您对其他服务一样进行设计。换句话说:不要让它成为静态的,而是定义一个单独的公共构造函数来获取它的所有依赖项。

标签: .net asp.net-mvc design-patterns dependency-injection castle-windsor


【解决方案1】:

我同意 cmets 你可能存在设计缺陷。

话虽如此,如果您必须这样做,您可以通过以下几种方式进行:

1) 使用服务定位器:从方法中解析所需的接口实现。有些人认为这是一种反模式,有点代码味道。

2) 使用可初始化的类级静态字段(可能以空对象实现开始):

public static class MyHelper
{
    private static IMyService service = new NullMyService();

    public static void Assign(IMyService instance)
    {
        service = instance;
    }

    public static string DoSomething(this HtmlHelper html)
    {
        return service.Whatever();
    }
}

然后从你的组合根(现在最流行的术语)你通过调用 assign 方法来设置服务:

...
MyHelper.Assign(container.Resolve<IMyService>());
...

可能不会感觉 100% 舒适,但会产生理想的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2023-03-10
    • 2015-04-05
    相关资源
    最近更新 更多