在HTML Helpers中使用Castle Windsor进行依赖注入

时间:2012-05-23 12:34:18

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

因此,我正在使用基于.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初始化的服务,但由于这个帮助器是一个静态方法,所以你没有选择构造函数注入。

1 个答案:

答案 0 :(得分: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%舒适,但会产生预期效果。