StructureMap在c#winforms中创建配置对象

StructureMap在c#winforms中创建配置对象,c#,.net,structuremap,C#,.net,Structuremap,使用structuremap和c#4.0,基本上我拥有的是: interface IBoard { void Setup(); } class Board : IBoard { IConfig _config; Board(IConfig config) { _config = config; } void Setup() { //use the _config object here } }

使用structuremap和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;
    }
}
现在在正常使用情况下,我只是说

For<Type>().Use<Class>() 
For()。使用()
或是我所有的依赖。然而,我所追求的是,在form1中设置config对象的值,然后使用在内存中设置并在整个应用程序中维护的配置值调用form2的最佳模式是什么?我想过使用单例,但是单例应该是可编辑的,或者至少是静态创建的,并且不接受基于参数的配置。。。那怎么办呢?我目前通过在winform启动程序中创建form1

ObjectFactory.Get<Form1>();
ObjectFactory.Get();

如果您注册
配置
如下:

For(Of IConfig).Singleton.Use(Of Config)
它将是单例,而StructureMap将处理其余部分

另一种方法是:


开始一个工作单元并设置您的值,完成您的工作,并处理UoW,但这有点复杂,我不知道您是否需要UoW。

如果您注册您的
配置
,如下所示:

For(Of IConfig).Singleton.Use(Of Config)
它将是单例,而StructureMap将处理其余部分

另一种方法是:


启动一个工作单元并设置您的价值观、完成您的工作和处理UoW,但是它有点复杂,我不知道您是否需要UoW。

我认为IConfig不适合使用容器创建,因为在实例化它之前,您不知道参数值。我认为您必须向调用容器的代码提供配置实例,以便获取表单

可以使用With方法向容器提供参数:

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

我认为IConfig不适合使用容器创建,因为在实例化它之前,您不知道参数值。我认为您必须向调用容器的代码提供配置实例,以便获取表单

可以使用With方法向容器提供参数:

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

如果我正确理解了OP,那么这种方法的问题在于,配置是基于创建时已知的参数创建的(不是在注册类型时)。它是在第一次从ObjectFactory请求时创建的。顺便问一下,在注册类型时是否真的需要创建它?如果是这样,请留下评论&我将更新我的帖子。为了创建配置,您需要一些数据,这些数据在用户将其输入Form1(注册后)之前是不可用的。这是我对OP问题的看法。正确的菲德伯格。如果配置数据是静态的,那么我只需将容器使用的对象指向加载或包含数据的某个具体类。我需要的是在DI容器注册了所有映射后设置的值。如果我正确理解了OP,那么这种方法的问题是,配置是基于创建时已知的参数创建的(不是在注册类型时)。它是在第一次从ObjectFactory请求时创建的。顺便问一下,在注册类型时是否真的需要创建它?如果是这样,请留下评论&我将更新我的帖子。为了创建配置,您需要一些数据,这些数据在用户将其输入Form1(注册后)之前是不可用的。这是我对OP问题的看法。正确的菲德伯格。如果配置数据是静态的,那么我只需将容器使用的对象指向加载或包含数据的某个具体类。我需要的是在DI容器注册了所有mappingssounds之后设置的值。很好,这正是我想要的。。。我会让它转一转,然后返回我编辑了你的答案,以适应一点,但问题仍然是游戏对象需要通过form1 ctor传入(我认为这是不必要的-请告诉我你对此的想法),并且有IConfig对象的游戏对象抛出和异常,因为它不是由SM正确创建的(当我移除它时,一切都是如此)@AaronHS-请用每个类所需的依赖项更新问题,并说明Form1为什么和何时需要游戏类。如果你尝试过我的建议,请说明你是如何实现的。我做了,有人编辑了它。我更新了你的答案,因为它是正确的,但缺少一些代码,有人删除了它。很棒的工作@an多玛。@PHeigerg我已经接受了你的答案,但我没有重新编写丢失的代码。(有很多,但总的来说,你的答案让我走上了正确的道路,因此我接受了)听起来不错,这正是我想要的……我会尝试一下,然后回复我对你的答案进行了编辑,以适应一些情况,但问题仍然是游戏对象需要通过form1 ctor传入(我认为这是不必要的-请告诉我你对此的想法)而有IConfig对象的游戏对象会抛出和异常,因为它不是由SM正确创建的(当我移除它时,一切正常)@AaronHS-请用每个类所需的依赖项更新问题,并说明Form1为什么和何时需要游戏类。如果你尝试过我的建议,请说明你是如何实现的。我做了,有人编辑了它。我更新了你的答案,因为它是正确的,但缺少一些代码,有人删除了它。很棒的工作@an多玛。@PHeigerg我已经接受了你的答案,但我没有重新编写丢失的代码。(有很多,但总的来说,你的答案让我走上了正确的道路,因此我接受了)