1

我正在从旧结构图转换为新结构图.. 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)

在 c:\BuildAgent\work\a395dbde6b793293\src\StructureMap\SessionCache.cs 中的 StructureMap.SessionCache.GetDefault(Type pluginType, IPipelineGraph pipelineGraph):c:\BuildAgent\work 中 StructureMap.Container.GetInstance(Type pluginType) 的第 63 行\a395dbde6b793293\src\StructureMap\Container.cs:C:\BuildAgent\work\a395dbde6b793293\src\StructureMap\Container.cs 中 StructureMap.Container.GetInstance() 的第 339 行:_Test_DAL.BaseTest.TestFixtureSetup() 中的第 202 行BaseTest.cs:第 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.

4

1 回答 1

0

事实证明,我正在初始化容器,如上所示,因此 ObjectFactory 没有初始化,根本没有扫描到它的 0 个对象......

让我重复一遍,因为我花了很长时间才摸索它……我讨厌你像我一样受苦……

在 StructureMap 3 中,您可以使用 ObjectFactory、Xor 容器……初始化容器会使 ObjectFactory 陷入困境。如果您愿意,您可以滚动您自己的 ObjectFactory(如下所示)或在某个地方设置一个在初始化时设置的全局静态容器。

查看此处的第二个代码部分以查看初始化结构图的每种方式的示例: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,方法工作,然后全局搜索并用 JCDCObjectfactory 替换 ObjectFactory,然后我就可以运行了……

我只需要稍后再回来重构它以改用构造函数参数。这样做的好处是我可以逐渐做到这一点,而不是一举一动。

于 2015-09-30T18:22:45.407 回答