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,我就起来 运行...

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