如何在请求对象时将Castle Windsor配置为使用Initialize
方法作为静态助手类?我试图添加一些扩展方法HtmlHelper
,所以它必须是一个静态类和方法。我的HtmlHelper
扩展程序取决于已使用Castle Windsor配置的IHtmlHelpersService
。我正在使用Convention Over Configuration。
修改
我认为我想要的是ComponentActivator
或UsingFactory
。我会这样走下去吗?
答案 0 :(得分:1)
我认为你的意思是Convention over configuration?
我不知道有什么方法可以做你的建议。它有点hacky,但你总是可以创建一个非静态的类,它符合接口并只是执行你需要的静态方法。有时这种类型的东西在使用第三方项目时是必然的。当然,如果您为Castle项目提供静态支持的补丁,他们可能会接受它
答案 1 :(得分:0)
我不认为IoC可以帮助你使用静态类,Windsor(或任何其他IoC)需要它可以实例化的东西(调用构造函数)。
您是否尝试根据配置更换辅助方法? 如果是这样,也许你可以编写一组扩展方法来调用IoC来实现它们。
答案 2 :(得分:0)
另一个选择是为所有ViewPages创建基类。使用您自己的版本隐藏现有的HtmlHelper属性:
public class MyHtmlHelper : HtmlHelper
{
// Take helper service, implement special methods
}
public class MyViewPage : ViewPage
{
protected new MyHtmlHelper HtmlHelper { get; set; }
// Wire up HtmlHelper as appropriate -- which is not going to be easy since
// the base property could be set at any time.
}
现在,您所有的视图页面都将使用您特殊的MyHtmlHelper以及所有特殊的酱汁,它们甚至不需要是扩展方法。一种变体是让MyHtmlHelper公开服务并继续编写以该帮助程序为目标的扩展方法。
答案 3 :(得分:-1)
您可以通过这种方式重构http://code.google.com/p/autofac/wiki/ExistingApplications:
适应静态类:
有时,应用程序会将相关功能分组到一组静态函数中:
static class IdGenerator
{
static int _next = 0;
public static int GetNext()
{
return ++_next;
}
}
这种设计通常在使用依赖注入创建的应用程序中没有位置。
相反,创建一个提供相同功能的界面:
interface IIdGenerator
{
int GetNext();
}
使用静态方法的实现适配器类:
class IdGeneratorAdapter : IdGenerator
{
public int GetNext()
{
return IdGenerator.GetNext();
}
}