在C#语言中,使用StructureMap 2.5.4,以.NET Framework 3.5库为目标。
我已采取步骤在结构图DI设置中支持多个配置文件,使用ServiceLocator模型和Bootstrapper激活。第一个设置是使用扫描仪加载默认注册表。
现在我想确定运行时我喜欢使用的注册表配置。使用注册表扫描和加载多个程序集。
似乎它不适用于实际实现(获取202,未找到默认实例),但剥离的测试版本确实有效。以下设置。
下面的工作代码示例(与其他设置相同的结构,但是使用更复杂的东西,得到的是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);
热爱社区活动。
答案 0 :(得分:2)
错误代码202表示无法为请求的类型构建默认实例。您的测试代码显然不等于您失败的真实代码。如果您收到有关Uri的错误,则可能有一个依赖项需要在其构造函数中使用Uri。它可能不是你要求的类 - 它可能是那个类依赖项之一 - 或者依赖项依赖项之一...某个地方有人要求StructureMap解析一个它不能做的Uri,没有一些帮助来自你。