StructureMap для создания объекта конфигурации в c # winforms - PullRequest
0 голосов
/ 18 мая 2011

Используя structmap и c # 4.0, я имею в виду следующее:

interface IBoard
{
    void Setup();
}

class Board : IBoard
{
    IConfig _config;

    Board(IConfig config)
    {
        _config = config;
    }

    void Setup()
    {
        //use the _config object here 
    }
}

class Game
{
    IBoard _board;

    Game(IBoard board)
    {
        _board = board;
    }
}

partial class Form1
{
    Form1()
    {
        InitializeForm();
    }

    //in here we need to do some work to setup the IConfig object 
    //via form controls
}

partial class Form2
{
    Game _game;

    Form1(Game game)
    {
        InitializeForm();
        _game = game;
    }
}

теперь при обычном использовании id просто скажите

For<Type>().Use<Class>() 

или около того для всех моих зависимостей.Однако, что мне нужно, это то, какой шаблон лучше всего использовать для установки значений объекта config в form1, а затем вызывать form2 со значениями config, установленными в памяти и поддерживаемыми в приложении?я думал об использовании синглтона, однако синглтон должен быть imuttable или, по крайней мере, быть статически созданным и не принимать конфигурацию на основе параметров ... ну и что делать?в настоящее время я создаю форму 1 в программе запуска winform через

ObjectFactory.Get<Form1>();

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Я не думаю, что IConfig хорошо подходит для создания с использованием контейнера, так как вы не знаете значений параметров, пока не пришло время его создать. Я думаю, что вы должны предоставить экземпляр конфигурации коду, который вызывает контейнер, чтобы получить форму.

Вы можете передать аргументы в контейнер, используя метод With:

ObjectFactory.With<IConfig>(theConfig).GetInstance<Form2>();

Вы хотите минимизировать обращения к контейнеру, желательно только к одному месту в вашем приложении, которое связывает остальную часть во время начальной загрузки. Альтернатива - зарегистрировать Func, разрешить его во время начальной загрузки и использовать его для создания экземпляра Form2.

Регистрация:

var formFactory = config => new Form2(config);
x.For<Func<IConfig, Form2>>().Use( () => formFactory);

Использование:

//Get the Func somehow, preferably as a ctor dependency in Form1
var form2Creator = ... 
var config = new Config({some parameters from Form1 here});
var form2 = form2Creator(config);
0 голосов
/ 18 мая 2011

Если вы зарегистрируетесь ваш Config как этот:

For(Of IConfig).Singleton.Use(Of Config)

Это будет singleton и StructureMap позаботитсяиз остальных.

Другой подход:

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

...