2014-10-12 3 views
2

Использование Net 4.5.1 и 3.1.4 StructureMapStructureMap все экземпляры абстрактных

У меня есть службы, простирающиеся абстрактный класс:

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

Есть в любом случае сделать это в целом действует против абстрактного класса, несмотря на это, имеющий общий классификатор?

ответ

1

Мое предложение, и то, что мы сделали с StructureMap для конфигурации в FubuMVC, чтобы создать класс что-то вроде:

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

и решить, что через StructureMap как синглтон. Тогда в любом классе, который нуждается в строке подключения, просто сделать:

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

соединит автоматическое связывание вашего ConnectionSettings объекта ко всем объектам класса, которые принимают в , что объект в их функциях конструктора.

Вы могли попробовать использовать пользовательский класс IPluginGraphConfiguration в StructureMap 3, чтобы установить CTOR аргумент явно на всех Instance о том, что построить подкласс, но я думаю, что будет больше работы.

+0

@ Джермей, спасибо. Я сделал это, как предложил KevM, и Weinart создал пользовательский объект настроек, который я передаю в абстракцию ** Charting **. Прекрасно работает. Оцените подсказку на графиках SM, и я посмотрел код FubuMVC. –

1

Это не решит настройку вашего аргумента конструктора конструктора через проблему профиля, но я хотел бы предложить вам избежать зависимости от примитивных типов, таких как 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 из FubuCore, чтобы сделать этот бриз. У вас просто есть объекты, которые заканчиваются настройками, которые автоматически изменяют их свойства вне параметров приложения. Чад Майерс имеет a nice blog post on it.

+0

Благодарим за отзыв о том, как избежать примитивных типов и ссылки на FubuCore. –

Смежные вопросы