如何配置StructureMap为两个参数提供两个相同类型的独立实例?

时间:2015-07-28 06:58:33

标签: structuremap named-instance

我有一种情况,其中类的构造函数需要两个实现接口的相同具体类型的实例。这是为了能够使用“任务”并行运行它们以减少时间。

构造函数代码如下:

公共SomeUsingClass(ISomeDependency someDepOne,ISomeDependency someDepTwo) { }

在这里,我只有一个实现ISomeDependency的具体类,它是SomeDependencyClass。

当我获得SomeUsingClass的实例时,我必须确保这两个参数指向SomeDependencyClass的单​​独实例。这是因为,当实例将在两个单独的任务下使用时,它们的“状态”不应该与另一个相冲突。

我尝试使用ISomeDependency的命名实例(将它们命名为“instanceOne”和“instanceTwo”。代码如下所示:

.For<ISomeDependency>().Add<SomeDependency>().Named("instanceOne");
.For<ISomeDependency>().Add<SomeDependency>().Named("instanceTwo");

...然后使用以下内容创建using类的实例:

.For<SomeUsingClass>().Use<SomeUsingClass>()
.Ctor<ISomeDependency>("someDepOne")
.IsNamedInstance("instanceOne")
.Ctor<ISomeDependency>("someDepTwo")
.IsNamedInstance("instanceTwo");

这会导致以下错误:

没有注册默认实例,无法自动确定“ISomeDependency”类型。

我已明确提到使用名称的特定实例。我哪里出错了?

1 个答案:

答案 0 :(得分:0)

您只需在注册.For<ISomeDependency>().AlwaysUnique().Add<SomeDependency>().Named("instanceOne"); .For<ISomeDependency>().AlwaysUnique().Add<SomeDependency>().Named("instanceTwo"); 时指定:

private static uint PBM_SETSTATE = 0x410;
public enum State { Normal = 1, Error = 2, Warning = 3 };

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
    public static void SetState(ProgressBar progressBar, int nState)
    {
        SendMessage(progressBar.Handle, PBM_SETSTATE, (IntPtr)nState, IntPtr.Zero);
    }