.net - 在 HTML Helpers 中使用 CaSTLe Windsor 进行依赖注入(inject)

标签 .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 初始化的服务,但由于这个 helper 是静态方法,因此您无法选择构造函数注入(inject)。

最佳答案

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

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

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

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();
    }
}

然后从您的组合根(这是当今流行的术语)通过调用分配方法来设置服务:

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

可能不会感觉 100% 舒服,但会产生预期的结果。

关于.net - 在 HTML Helpers 中使用 CaSTLe Windsor 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720023/

相关文章:

c# - 如何在不使用反射的情况下访问一系列类的公共(public)属性

.net - 我应该在.NET应用程序中使用binary/xml文件吗?

asp.net-mvc - 如何以正确的方式对 ASP.NET MVC 2.0 Controller 进行单元测试!

c# - 使用设计模式在Visual Studio GUI应用程序中分离 View

java - 适用于简单聊天应用程序的设计模式

java - 哪种设计模式用于创建继承对象?

c# - Response.Redirect() 将绝对 URL 作为相对 URL 处理

.net - 为什么 Dimension.End.Column 返回的索引大于具有任何值的最后一列?

asp.net-mvc - 使用 IIS Express 8.0 在 Visual Studio 2013 中进行调试时,无法使用 Windows 身份验证访问[授权] MVC 方法

javascript - 如何在 Ajax 响应中访问模型数据