2

所以,我正在做基于 .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 是一个静态方法,所以你没有构造函数注入的选项。

4

1 回答 1

2

我同意您可能存在设计缺陷的评论。

话虽这么说,如果您必须这样做,有几种方法可以解决:

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% 舒适,但会产生理想的结果。

于 2012-05-23T14:05:18.730 回答