我希望我的构造函数使用参数调用另一个构造函数,但是当我这样做(MyProperty)时,MyProperty必须是静态的。问题出在这个静态属性的getter中,我必须从structuremap Container获取一个ISettingReader的实例,因为它是静态的,我的容器只包含两个元素而不是超过50个元素,然后它找不到实例。 (ISettingReader上的pluginFamily错误)
这是我的代码。
private static Func<LinqDataContext> _contextFactory;
public static Func<LinqDataContext> DefaultContextFactory
{
get
{
var settingReader = ObjectFactory.GetInstance<ISettingReader>(); // I get an error saying it can't find ISettingReader()
var connectionString = settingReader.GetSetting("MyProject.ConnectionString");
_contextFactory = () => new LinqDataContext(connectionString);
return _contextFactory;
}
}
public MyProjectViewModelService() : this(DefaultContextFactory)
{
}
public MyProjectViewModelService(Func<LinqDataContext> contextFactory)
{
_contextFactory = contextFactory;
}
我认为如果我可以摆脱我的静态关键字,它应该可行。我确认在Program.exe
中启动应用程序时,我已经在structureMap容器中初始化了我的ISettingReader那我该怎么办? 谢谢!
约翰
PS:我在stackoverflow上发现了类似的问题,但是他没有使用structureMap: Constructor chaining with intermediate variables
答案 0 :(得分:1)
为什么不将代码从getter移动到默认构造函数,并将ISettingReader作为依赖项放在构造函数中。当您请求新的MyProjectViewModelService时,Structuremap将自动解析ISettingReader并为该依赖项提供实例化的默认类型。
所以,如果你有
public MyProjectViewModelService(ISettingReader settingReader)
{
var connectionString = settingReader.GetSetting("MyProject.ConnectionString");
_contextFactory = () => new LinqDataContext(connectionString);
}
您可以删除其余部分。
您从structuremap获得的异常是因为您没有为ISettingReader配置任何默认实例