为什么在两个相同的设置结构图代码路径中获得202

时间:2010-01-03 16:39:02

标签: dependency-injection structuremap ioc-container

在C#语言中,使用StructureMap 2.5.4,以.NET Framework 3.5库为目标。

我已采取步骤在结构图DI设置中支持多个配置文件,使用ServiceLocator模型和Bootstrapper激活。第一个设置是使用扫描仪加载默认注册表。

现在我想确定运行时我喜欢使用的注册表配置。使用注册表扫描和加载多个程序集。

似乎它不适用于实际实现(获取202,未找到默认实例),但剥离的测试版本确实有效。以下设置。

  • 包含注册表和实现的两个程序集
  • 在运行AppDomain中扫描它们,提供共享接口,并使用构造函数中的接口(在Invokation上将fromx处理到ofx)来请求创建实例

下面的工作代码示例(与其他设置相同的结构,但是使用更复杂的东西,得到的是202):

202可以使用什么类型的couses,特别是命名System.Uri类型,而不是默认类型的句柄? (uri毫无意义)

// let structure map create instance of class tester, that provides the registered
// interfaces in the registries to the constructor of tester.

   public class Tester<TPOCO>
                {
                    private ITestMe<TPOCO> _tester;

                    public Tester(ITestMe<TPOCO> some)
                    {
                        _tester = some;
                    }

                    public string Exec()
                    {
                        return _tester.Execute();
                    }
                }

     public static class Main {
            public void ExecuteDIFunction() {
            ObjectFactory.GetInstance<Tester<string>>().Exec();
            }
        }



    public class ImplementedTestMe<TSome> : ITestMe<TSome>
        {
            public string Execute()
            {
                return "Special Execution";
            }
        }

    public class RegistryForSpecial : Registry
        {
            public RegistryForSpecial()
            {
                CreateProfile("Special",
                              gc =>
                                  {
                                      gc.For(typeof(ITestMe<>)).UseConcreteType(typeof(ImplementedTestMe<>));

                                  });
            }
        }

修改 似乎缺少的接口实际上是确定运行时的接口。所以这是下一个挑战(并解决):

每当StructureMap需要创建对象时,我都提供了一个默认对象。像:

x.ForRequestedType<IConnectionContext>()
                  .TheDefault.Is.Object(new WebServiceConnection());

这样我摆脱了202错误,因为现在可以使用一个真实的实例,只要结构图需要这种类型。

接下来是运行时的覆盖。这在最初使用ObjectFactory.Configure方法时没有用。相反,我使用ObjectFactory.Inject方法来覆盖默认实例。像魅力一样。

ObjectFactory.Inject(typeof(IConnectionContext), context);

热爱社区活动。

1 个答案:

答案 0 :(得分:2)

错误代码202表示无法为请求的类型构建默认实例。您的测试代码显然不等于您失败的真实代码。如果您收到有关Uri的错误,则可能有一个依赖项需要在其构造函数中使用Uri。它可能不是你要求的类 - 它可能是那个类依赖项之一 - 或者依赖项依赖项之一...某个地方有人要求StructureMap解析一个它不能做的Uri,没有一些帮助来自你。