构造映射抽象的所有实例
本文关键字:实例 抽象的 映射 | 更新日期: 2023-09-27 18:26:19
使用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
});
}
}
尽管抽象类有一个泛型限定符,但有没有办法对抽象类执行这种操作?
我的建议,以及我们在FubuMVC中对StructureMap所做的配置,是创建一个类似于的类
public class ConnectionSettings
{
public string Connection {get;set;}
}
并通过StructureMap将其作为单例进行解析。然后在任何需要连接字符串的类中,只需执行:
public abstract class DatabaseConnectionUser
{
public DatabaseConnectionUser(ConnectionSettings settings){}
}
Autowiring将把ConnectionSettings
对象连接到所有接收的类对象该对象的构造函数。
您可以尝试在StructureMap 3中使用自定义IPluginGraphConfiguration
类,在所有构建子类的Instance上显式设置ctor参数,但我认为这将是更多的工作。
这并不能解决通过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.
如果你有很多设置,你可能想将这种模式常规化。我们使用富步酷睿的SettingsProvider
让这一切变得轻而易举。您只需将对象以"设置"结尾,即可从应用程序设置中自动填充其属性。Chad Myers有一篇很好的博客文章。