London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!

Initialization Module for Catalog importer

Vote:
 

I am writing a custom catalog importer for EPI Server that would import catalog data into EPI Server from a non-EPIserver System. I am planning to use the API. I am new to EPI Server. I am trying to execute the statement below in my pilot program but I get the initilization erros. 


int catalogId = 2;

// Get a CatalogDto object.

CatalogDto catalogDto = CatalogContext.Current.GetCatalogDto(catalogId, new CatalogResponseGroup(CatalogResponseGroup.ResponseGroup.CatalogInfo));

Error: The type initializer for 'Mediachase.Commerce.Catalog.CatalogContext' threw an exception. 

I am looking for help to identify the pre-requisits for the above statement to run. I sort of have an idea of having the configuration files in place but that did not help as well. 

Thanks in advance for your hlep.

Syed

 

#80915
Feb 04, 2014 23:48
Vote:
 

To add more information.

I am following this link http://sdk.episerver.com/commerce/1.1/Content/Developers%20Guide/Catalog%20System/Catalog%20How%20To%20Code%20Samples/Creating%20Catalog%20Entries.htm

 

If somebody can provide a working version of this code in a pilot project, that would be great.

Thanks,

Syed

#80916
Feb 05, 2014 0:07
Vote:
 

Had the same exception initialy as you have:

System.TypeInitializationException: The type initializer for 'Mediachase.Commerce.Catalog.CatalogContext' threw an exception. ---> EPiServer.ServiceLocation.ActivationException: Activation error occurred while trying to get instance of type IWarehouseRepository, key "" ---> StructureMap.StructureMapException: StructureMap Exception Code:  202
No Default Instance defined for PluginFamily EPiServer.Framework.Cache.ISynchronizedObjectInstanceCache, EPiServer.Framework, Version=7.6.3.0, Culture=neutral, PublicKeyToken=8fe83dea738b45b7
   at StructureMap.BuildSession.<.ctor>b__0(Type t)
   at StructureMap.Util.Cache`2.get_Item(KEY key)
   at StructureMap.BuildSession.CreateInstance(Type pluginType)
   at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)
   at lambda_method(Closure , IArguments )
   at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.<CreateBuilder>b__0(IArguments args)
   at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)
   at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)
   at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)
   at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)
   at StructureMap.BuildSession.CreateInstance(Type pluginType)
   at EPiServer.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key)
   --- End of inner exception stack trace ---
   at EPiServer.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key)
   at EPiServer.ServiceLocation.ServiceLocatorImplBase.GetInstance[TService]()
   at Mediachase.Commerce.Catalog.Impl.CatalogContextImpl..ctor(MetaDataContext context)
   at Mediachase.Commerce.Catalog.CatalogContext..cctor()
   --- End of inner exception stack trace ---
   at Mediachase.Commerce.Catalog.CatalogContext.get_Current()

    

 

So to successfully initialize CatalogContext and Dynamic Data Store I have this initialization code:

 

            ...            
            if (DynamicDataStoreFactory.Instance != null)
            {
                return;
            }

            var context = new ServiceConfigurationContext(HostType.Installer, new Container());
            new CommerceInitialization().ConfigureContainer(context);
            new EventsInitialization().ConfigureContainer(context);

            var factory = new SqlDatabaseFactory();
            context.Container.Configure(ce => ce.For<IDatabaseHandler>().Use(factory.CreateDefaultHandler));

            context.Container.Configure(ce => ce.For<IPriceService>().Use<PriceServiceDatabase>());

            context.Container.Configure(ce => ce.For<IObjectInstanceCache>().Use<HttpRuntimeCache>());
            context.Container.Configure(ce => ce.For<ISynchronizedObjectInstanceCache>().Use<RemoteCacheSynchronization>());

            var locator = new StructureMapServiceLocator(context.Container);
            ServiceLocator.SetLocator(locator);
            DataInitialization.InitializeFromCode(context.Container, factory, null);

            DynamicDataStoreFactory.Instance = new EPiServerDynamicDataStoreFactory();
            ...

    

#85022
Edited, Apr 11, 2014 10:39
Vote:
 

I am trying to use your code, but having trouble resolving the following objects / types. Am I missing a reference?

 

DynamicDataStoreFactory

SqlDatabaseFactory

IDatabaseHandler

RemoteCacheSynchronization

DataInitialization

#85635
Apr 30, 2014 20:51
Vote:
 

Finally I got it working, but I had to add a Fake interface implemenation (below) to make it work for me. (Thanks to another community memeber Murtaza's post) 

 

ce.For<ITypeScannerLookup>().HybridHttpOrThreadLocalScoped().Use<FakeTypeScannerLookup>();

 public class FakeTypeScannerLookup : ITypeScannerLookup
    {
        private static object _lock = new object();
        private HashSet<Type> _types = new HashSet<Type>();

        /// <summary>
        /// Gets the scanned types.
        /// 
        /// </summary>
        public IEnumerable<Type> AllTypes
        {
            get
            {
                return (IEnumerable<Type>)this._types;
            }
        }

        static FakeTypeScannerLookup()
        {
        }

        /// <summary>
        /// Adds the specified scanned type.
        /// 
        /// </summary>
        /// <param name="t">The t.</param>
        public void Add(Type t)
        {
            lock (_lock)
                this._types.Add(t);
        }

        /// <summary>
        /// Deletes the specified scanned type.
        /// 
        /// </summary>
        /// <param name="t">The t.</param>
        public void Delete(Type t)
        {
            this._types.Remove(t);
        }
    }
    

    

#85638
Apr 30, 2014 22:14
Vote:
 
DynamicDataStoreFactory -> EPiServer.Data.Dynamic.DynamicDataStoreFactory
SqlDatabaseFactory -> EPiServer.Data.Providers.SqlDatabaseFactory
IDatabaseHandler -> EPiServer.Data.IDatabaseHandler
RemoteCacheSynchronization -> EPiServer.Events.RemoteCacheSynchronization
DataInitialization -> EPiServer.Data.DataInitialization

    maybe this will help someone

#85810
May 06, 2014 10:21
Vote:
 

Could you please explain a bit, where woudl this code go and how.

#85993
May 09, 2014 19:35
Vote:
 

Nevermind got it

#86006
May 10, 2014 18:53
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.