我正在从旧结构图转换到新结构图.2。3.1.6.186 ......
我正在尝试将IWebAccess的默认实例定义为WinFormAccess ...运行时我收到此错误:
SetUp:StructureMap.StructureMapConfigurationException:没有注册默认实例,无法自动确定类型 'JCDCTools.Core.Utilities.Interfaces.IWebAccess'
没有指定配置 JCDCTools.Core.Utilities.Interfaces.IWebAccess
1。)Container.GetInstance(JCDCTools.Core.Utilities.Interfaces.IWebAccess)
在StructureMap.SessionCache.GetDefault(Type pluginType, IPipelineGraph pipelineGraph)中 C:\ BuildAgent \工作\ a395dbde6b793293的\ src \ StructureMap \ SessionCache.cs: 在StructureMap.Container.GetInstance(Type pluginType)中的第63行 C:\ BuildAgent \工作\ a395dbde6b793293的\ src \ StructureMap \ Container.cs: StructureMap.Container.GetInstance()中的第339行 C:\ BuildAgent \工作\ 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.)
答案 0 :(得分:0)
事实证明,我正在如上所示初始化容器,因此ObjectFactory没有初始化,根本没有对象扫描到它...
让我再说一遍,因为我花了很长时间才开始研究它......而且我讨厌你像我一样受苦......
在StructureMap 3中,您可以使用ObjectFactory,Xor容器......启动容器会使ObjectFactory死在水中。如果你想要你可以滚动你自己的ObjectFactory(如下所示)或者在初始时设置一个全局静态容器。
在这里查看第二个代码部分,以查看init结构图的每种方式的示例: http://structuremap.github.io/registration/
(如果有人知道如何使用容器初始化对象工厂,因为它的输入我很想知道,那样重构可以是一个渐进的过程,而不是一个完整的过程,直到我完成。)
如果我用容器样式调用替换我的ObjectFactory,它可以工作。 为了让我的生活更轻松,我根据另一个SO问题答案创建了这个课程,我自己添加了一个使用容器的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,方法,然后全局搜索&amp;用JCDCObjectfactory替换ObjectFactory,我正在运行......
我只需要稍后再回来并重构所有内容以使用Constructor参数。关于这一点的好处是我可以逐渐地做到这一点,而不是一下子就完成。