2

使用 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
        });
    }
 }

无论如何,尽管抽象类具有通用限定符,但它通常会针对抽象类执行此操作吗?

4

2 回答 2

1

我的建议,以及我们在 FubuMVC 中使用 StructureMap 进行配置的方法是创建一个类似的类:

public class ConnectionSettings
{
    public string Connection {get;set;}
}

并通过 StructureMap 将其作为单例解决。然后在需要连接字符串的任何类中,只需执行以下操作:

public abstract class DatabaseConnectionUser
{
    public DatabaseConnectionUser(ConnectionSettings settings){}
}

自动装配会将您的ConnectionSettings对象连接到在其构造函数中接收该对象的所有类对象。

可以尝试IPluginGraphConfiguration在 StructureMap 3 中使用自定义类来在所有构建子类的实例上显式设置 ctor 参数,但我认为这会更有效。

于 2014-10-14T02:11:12.437 回答
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。

如果您有很多设置,您可能希望将此模式常规化。我们使用SettingsProviderFubuCore让这变得轻而易举。您只需拥有以 Settings 结尾的对象,这些对象的属性会自动从应用程序设置中填充出来。Chad Myers 有一篇不错的博客文章

于 2014-10-13T14:25:38.340 回答