使用Net 4.5.1和StructureMap 3.1.4
我有扩展抽象类的服务:
public abstract class Charting<T> {
protected readonly String baseConfigurationString;
public Charting(String baseConfigurationString)
{
this.baseConfigurationString = baseConfigurationString;
}
...
}
对于每个具体服务,我想设置 baseConfigurationString 。现在我按服务单独进行:
public class MyRegistry : Registry
{
public MyRegistry()
{
Profile("Development", x => {
ForConcreteType<AveragePartySizeChart>().Configure.Ctor<String>("baseConfigurationString").Is(MyDbConfiguration.getBaseConnectionString());
...next service....about 6 total
});
}
}
无论如何,除非它具有通用限定词,否则通常会对抽象类采取行动吗?
答案 0 :(得分:1)
这不能通过Profile问题解决您的抽象构造函数参数设置,但我建议您避免依赖于System.String
等基本类型,而是使用抽象。
您可以使用类型IDatabaseSettings
来获取环境变量或应用程序设置所需的连接设置。
public interface IDatabaseSettings
{
string DbConnectionString { get; set; }
}
public class DatabaseSettings : IDatabaseSettings
{
public string DbConnectionString { get; set; }
}
public class DatabaseRegistry : Registry
{
public DatabaseRegistry()
{
For<IDatabaseSettings>().Use(c =>
{
var setting = c.GetInstance<DatabaseSettings>();
setting.DbConnectionString =
System.Configuration.ConfigurationManager.AppSettings["DatabaseSettings.DBConnectionString"];
return setting;
});
}
}
重要提示:您的项目需要引用System.Configuration。
如果你有很多设置,你可能想要传统化这种模式。我们使用FubuCore中的SettingsProvider
来轻松实现这一目标。您只需拥有以“设置”结尾的对象,这些对象会自动从应用程序设置中填充其属性。 Chad Myers有a nice blog post on it。
答案 1 :(得分:1)
我的建议,以及我们在FubuMVC中使用StructureMap进行配置的方法是创建一个类如下的类:
public class ConnectionSettings
{
public string Connection {get;set;}
}
并通过StructureMap将其解析为单例。然后在任何需要连接字符串的类中,只需执行:
public abstract class DatabaseConnectionUser
{
public DatabaseConnectionUser(ConnectionSettings settings){}
}
自动装配会将您的ConnectionSettings
对象连接到所有接收的类对象
该对象在它们的构造函数中。
你可以尝试使用StructureMap 3中的自定义IPluginGraphConfiguration
类在构建子类的所有实例上显式设置ctor参数,但我认为这样做会更多。