Structuremap所有抽象实例

时间:2014-10-12 16:49:43

标签: c# structuremap structuremap3

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

无论如何,除非它具有通用限定词,否则通常会对抽象类采取行动吗?

2 个答案:

答案 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参数,但我认为这样做会更多。