public IContainer Configure(ContainerBuilder builder)
        {
            var context = new DbContextOptionsBuilder <WellDataDbContext>();

            context.UseInMemoryDatabase("WellList");

            builder.RegisterType <WellDataDbContext>().WithParameter("options", context.Options);


            //register all interfaces to concretes by name convention except those excluded from scan
            foreach (var assembly in WellDataAssemblies.GetAllAssemblies())
            {
                builder.RegisterAssemblyTypes(assembly)
                .Where(t => t.CustomAttributes.All(s => !s.AttributeType.Name.Contains("ExcludeFromScan")))
                .AsImplementedInterfaces();
            }

            foreach (var assembly in WellDataUiAssemblies.GetUiAssemblies())
            {
                RegisterMvvm(builder, assembly);
            }


            //  register the single window manager for this container
            builder.RegisterType <WindowManager>().As <IWindowManager>().SingleInstance();

            //register generic factory
            builder
            .RegisterGeneric(typeof(Factory <>))
            .As(typeof(IFactory <>))
            .InstancePerDependency();

            //register strategy pattern
            builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(IWellDataImportStrategy)))
            .Where(t => typeof(IWellDataImportStrategy).IsAssignableFrom(t))
            .AsSelf();

            //register other interfaces



            builder.Register <Func <string, IWellDataImportStrategy> >(c =>
            {
                var types = c.ComponentRegistry.Registrations
                            .Where(r => typeof(IWellDataImportStrategy).IsAssignableFrom(r.Activator.LimitType))
                            .Select(r => r.Activator.LimitType);

                IWellDataImportStrategy[] lst = types.Select(t => c.Resolve(t) as IWellDataImportStrategy).ToArray();

                return((file) =>
                {
                    return lst.FirstOrDefault(x => x.CanProcess(file));
                });
            });

            return(builder.Build());
        }
 protected override IEnumerable <Assembly> SelectAssemblies()
 {
     return(WellDataUiAssemblies.GetUiAssemblies());
 }