构造映射抽象的所有实例

本文关键字:实例 抽象的 映射 | 更新日期: 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有一篇很好的博客文章。