Structuremap 3+ (3.1.6.186) 如何指定默认实例?
Structuremap 3+ (3.1.6.186) how to specify a default instance?
我正在从旧结构图转换到新结构图。2. 3.1.6.186 的东西...
我正在尝试将 IWebAccess 的默认实例定义为 WinFormAccess...当 运行 时,我收到此错误:
SetUp : StructureMap.StructureMapConfigurationException : No default Instance is registered and cannot be automatically determined for type
'JCDCTools.Core.Utilities.Interfaces.IWebAccess'
没有指定配置
JCDCTools.Core.Utilities.Interfaces.IWebAccess
1.) Container.GetInstance(JCDCTools.Core.Utilities.Interfaces.IWebAccess)
在StructureMap.SessionCache.GetDefault(输入插件类型,
IPipelineGraph pipelineGraph) 中
c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\SessionCache.cs:
第 63 行在 StructureMap.Container.GetInstance(Type pluginType) 中
c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\Container.cs:
StructureMap.Container.GetInstance() 中的第 339 行
c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\Container.cs:
BaseTest.cs 中 _Test_DAL.BaseTest.TestFixtureSetup() 的第 202 行:
第 22 行
这是我的代码
public DefaultRegistry()
{
Scan(
scan =>
{
scan.AssemblyContainingType<IWebAccess>(); // JCDCTools.Core
scan.LookForRegistries();
scan.WithDefaultConventions();
});
For<IWebAccess>()
.LifecycleIs<HybridLifecycle>() //why isn't this creating a default instance?
.Use<WinFormAccess>();
}
我用谷歌搜索和挖掘,但我不明白为什么 For.use 没有创建默认实例...它看起来很简单,但我无法让它工作..
任何人都可以帮助我理解我做错了什么吗?要么是代码示例,要么是解释得比 Github 上的官方文档更好的文档
(http://structuremap.github.io.)
事实证明,我正在初始化容器,如上所示,因此 ObjectFactory 根本没有初始化,它扫描了 0 个对象...
让我重复一遍,因为我花了很长时间才理解它……我不希望你像我一样受苦……
在 StructureMap 3 中,您可以使用 ObjectFactory、Xor 容器...初始化容器会使 ObjectFactory 陷入困境。如果你愿意,你可以推出自己的 ObjectFactory(如下所示)或在某处设置一个全局静态容器,该容器在初始化时设置。
查看此处的第二个代码部分以查看初始化结构图的每种方式的示例:
http://structuremap.github.io/registration/
(如果有人知道如何使用容器作为输入来初始化对象工厂,我很想知道,这样重构可以是一个渐进的过程,而不是在我完成之前完全停止。)
如果我用容器样式调用替换我的 ObjectFactory,它就可以工作。
为了让我的生活更轻松,我根据另一个 SO 问题的答案做了这个 class,我自己添加了一个使用容器的 GetInstance 方法。
public static class JcdcObjectFactory
{
private static readonly Lazy<Container> _containerBuilder =
new Lazy<Container>( defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication );
public static T GetInstance<T>()
{
return Container.GetInstance<T>();
}
public static IContainer Container
{
get { return _containerBuilder.Value; }
}
private static Container defaultContainer()
{
return new Container( x =>
{
// default config, you have to call your initializer here, if you want you can remove the lazy stuff, and make the container a property and set it where ever you init your Structuremap, for me that's IOC.cs - EWB
} );
}
}
因为我们只使用 GetInstance 和 GetNamedInstance,我只需要添加一个 GetNamedInstance,方法工作,然后全局搜索并将 ObjectFactory 替换为 JCDCObjectfactory,我就起来 运行...
我只需要稍后回来重构它,改用构造函数参数。这样做的好处是我可以逐渐做到这一点,而不是一蹴而就。
我正在从旧结构图转换到新结构图。2. 3.1.6.186 的东西...
我正在尝试将 IWebAccess 的默认实例定义为 WinFormAccess...当 运行 时,我收到此错误:
SetUp : StructureMap.StructureMapConfigurationException : No default Instance is registered and cannot be automatically determined for type 'JCDCTools.Core.Utilities.Interfaces.IWebAccess'
没有指定配置 JCDCTools.Core.Utilities.Interfaces.IWebAccess
1.) Container.GetInstance(JCDCTools.Core.Utilities.Interfaces.IWebAccess)
在StructureMap.SessionCache.GetDefault(输入插件类型, IPipelineGraph pipelineGraph) 中 c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\SessionCache.cs: 第 63 行在 StructureMap.Container.GetInstance(Type pluginType) 中 c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\Container.cs: StructureMap.Container.GetInstance() 中的第 339 行 c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\Container.cs: BaseTest.cs 中 _Test_DAL.BaseTest.TestFixtureSetup() 的第 202 行: 第 22 行
这是我的代码
public DefaultRegistry()
{
Scan(
scan =>
{
scan.AssemblyContainingType<IWebAccess>(); // JCDCTools.Core
scan.LookForRegistries();
scan.WithDefaultConventions();
});
For<IWebAccess>()
.LifecycleIs<HybridLifecycle>() //why isn't this creating a default instance?
.Use<WinFormAccess>();
}
我用谷歌搜索和挖掘,但我不明白为什么 For.use 没有创建默认实例...它看起来很简单,但我无法让它工作..
任何人都可以帮助我理解我做错了什么吗?要么是代码示例,要么是解释得比 Github 上的官方文档更好的文档 (http://structuremap.github.io.)
事实证明,我正在初始化容器,如上所示,因此 ObjectFactory 根本没有初始化,它扫描了 0 个对象...
让我重复一遍,因为我花了很长时间才理解它……我不希望你像我一样受苦……
在 StructureMap 3 中,您可以使用 ObjectFactory、Xor 容器...初始化容器会使 ObjectFactory 陷入困境。如果你愿意,你可以推出自己的 ObjectFactory(如下所示)或在某处设置一个全局静态容器,该容器在初始化时设置。
查看此处的第二个代码部分以查看初始化结构图的每种方式的示例: http://structuremap.github.io/registration/
(如果有人知道如何使用容器作为输入来初始化对象工厂,我很想知道,这样重构可以是一个渐进的过程,而不是在我完成之前完全停止。)
如果我用容器样式调用替换我的 ObjectFactory,它就可以工作。 为了让我的生活更轻松,我根据另一个 SO 问题的答案做了这个 class,我自己添加了一个使用容器的 GetInstance 方法。
public static class JcdcObjectFactory
{
private static readonly Lazy<Container> _containerBuilder =
new Lazy<Container>( defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication );
public static T GetInstance<T>()
{
return Container.GetInstance<T>();
}
public static IContainer Container
{
get { return _containerBuilder.Value; }
}
private static Container defaultContainer()
{
return new Container( x =>
{
// default config, you have to call your initializer here, if you want you can remove the lazy stuff, and make the container a property and set it where ever you init your Structuremap, for me that's IOC.cs - EWB
} );
}
}
因为我们只使用 GetInstance 和 GetNamedInstance,我只需要添加一个 GetNamedInstance,方法工作,然后全局搜索并将 ObjectFactory 替换为 JCDCObjectfactory,我就起来 运行...
我只需要稍后回来重构它,改用构造函数参数。这样做的好处是我可以逐渐做到这一点,而不是一蹴而就。