Structuremap 3+(3.1.6.186)如何指定默认实例?

时间:2015-09-29 21:01:42

标签: c# asp.net-mvc structuremap structuremap3

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

1 个答案:

答案 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参数。关于这一点的好处是我可以逐渐地做到这一点,而不是一下子就完成。