public void RegisterAssemblyProvider(AssemblyProvider assemblyProvider)
 {
     AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args) {
         byte[] assemblyData = assemblyProvider.GetAssembly(args.Name);
         return(assemblyData != null?Assembly.Load(assemblyData) : null);
     };
 }
Exemple #2
0
        public IDictionary <string, IBackend> CreateAll()
        {
            var result = new Dictionary <string, IBackend>();

            foreach (var assembly in AssemblyProvider.GetAll())
            {
                foreach (var type in assembly.Types)
                {
                    var attribute = type.GetCustomAttribute <DataTableBackendAttribute>();

                    if (attribute == null)
                    {
                        continue;
                    }

                    if (!typeof(IBackend).IsAssignableFrom(type))
                    {
                        throw new DataTableBackendDoesNotImplementIBackendException(type);
                    }

                    result.Add(attribute.Id, (IBackend)Instantiator.Instantiate(type));
                }
            }

            return(result);
        }
        public IEnumerable <ISaveListener <object> > Create()
        {
            var result = new List <ISaveListener <object> >();

            foreach (var type in AssemblyProvider.GetAll().SelectMany(a => a.Types))
            {
                if (!type.IsClass)
                {
                    continue;
                }

                if (type.IsAbstract)
                {
                    continue;
                }

                if (!typeof(ISaveListener <object>).IsAssignableFrom(type))
                {
                    continue;
                }

                Logger.LogInformation($"Creating SaveListener {type}");

                result.Add((ISaveListener <object>)Instantiator.Instantiate(type));
            }

            return(result.AsReadOnly());
        }
        /// <summary>
        /// Assembly that has been removed completely from <see cref="AssembliesManager" />.
        /// </summary>
        /// <param name="assembly">Removed assembly.</param>
        private void _onAssemblyRemoved(AssemblyProvider assembly)
        {
            startTransaction("Unregistering assembly: " + assembly.Name);

            try
            {
                var componentsCopy = GetComponents(assembly).ToArray();
                foreach (var component in componentsCopy)
                {
                    _onComponentRemoved(assembly, component);
                }

                if (assembly.TypeServices.RegisteredInvalidationHandler != null)
                {
                    //remove handler
                    NameInvalidated -= assembly.TypeServices.RegisteredInvalidationHandler;
                }

                assembly.Unload();

                if (AssemblyRemoved != null)
                {
                    AssemblyRemoved(assembly);
                }
            }
            finally
            {
                commitTransaction();
            }
        }
        /// <summary>
        /// Initialize assemblies setup.
        /// </summary>
        /// <param name="logger"><see cref="ILogger"/> to use for logging.</param>
        /// <param name="entryAssembly"><see cref="Assembly"/> to use as entry assembly - null indicates it will get it from the <see cref="Assembly.GetEntryAssembly()"/> method.</param>
        /// <param name="defaultAssemblyProvider">The default <see cref="ICanProvideAssemblies"/> - null inidicates it will use the default implementation.</param>
        /// <param name="excludeAllCallback">A callback to build on the exclude all specification.</param>
        /// <returns>Discovered <see cref="IAssemblies"/>.</returns>
        public static IAssemblies Start(
            ILogger logger,
            Assembly entryAssembly = null,
            ICanProvideAssemblies defaultAssemblyProvider = null,
            Action <ExcludeAll> excludeAllCallback        = null)
        {
            var assembliesConfigurationBuilder = new AssembliesConfigurationBuilder();
            var assembliesSpecification        = assembliesConfigurationBuilder
                                                 .ExcludeAll()
                                                 .ExceptProjectLibraries()
                                                 .ExceptDolittleLibraries();

            excludeAllCallback?.Invoke(assembliesSpecification);

            if (entryAssembly == null)
            {
                entryAssembly = Assembly.GetEntryAssembly();
            }

            var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder);
            var assemblyFilters         = new AssemblyFilters(assembliesConfiguration);

            var assemblyProvider = new AssemblyProvider(
                new ICanProvideAssemblies[] { defaultAssemblyProvider ?? new DefaultAssemblyProvider(logger, entryAssembly) },
                assemblyFilters,
                new AssemblyUtility(),
                logger);

            var assemblies = new Assemblies(entryAssembly, assemblyProvider);

            return(assemblies);
        }
        public static void AddCloudy(this IServiceCollection services, Action <CloudyConfigurator> cloudy)
        {
            services.Configure <RouteOptions>(options =>
            {
                options.ConstraintMap.Add("contentroute", typeof(ContentRouteConstraint));
            });

            var options      = new CloudyOptions();
            var configurator = new CloudyConfigurator(services, options);

            cloudy(configurator);

            configurator.AddComponent <CloudyAssemblyHandle>();

            if (Assembly.GetCallingAssembly() != Assembly.GetExecutingAssembly())
            {
                configurator.AddComponentAssembly(Assembly.GetCallingAssembly());
            }

            var AssemblyProvider = new AssemblyProvider(options.Assemblies.Select(a => new AssemblyWrapper(a)));

            services.AddSingleton <IAssemblyProvider>(AssemblyProvider);


            services.AddSingleton <IContextDescriptorProvider>(new ContextDescriptorProvider(ContextDescriptor.CreateFrom(options.Contexts)));

            foreach (var injector in new DependencyInjectorProvider(new DependencyInjectorCreator(AssemblyProvider)).GetAll())
            {
                injector.InjectDependencies(services);
            }

            services.AddTransient <IStartupFilter, InitializerBootstrapper>();
        }
        /// <summary>
        /// Assembly has been registered (every assembly has to be registered exactly one if loaded).
        /// </summary>
        /// <param name="assembly">Registered assembly.</param>
        private void _onAssemblyRegistered(AssemblyProvider assembly)
        {
            //attach after action to outer scope of assembly
            after_reloadAssembly(assembly);
            startTransaction("Registering assembly: " + assembly.Name);

            //hook component handlers
            assembly.ComponentAdded   += (compInfo) => _onComponentAdded(assembly, compInfo);
            assembly.ComponentRemoved += (compInfo) => _onComponentRemoved(assembly, compInfo);

            var services = new TypeServices(assembly, this);

            //this assign causes assembly initialization (loading references)
            assembly.TypeServices = services;

            try
            {
                if (AssemblyAdded != null)
                {
                    AssemblyAdded(assembly);
                }
            }
            finally
            {
                commitTransaction();
            }

            //assembly has to be be initialized only if it is a Root assembly or Root's assembly reference by caller
        }
Exemple #8
0
        public static IServiceCollection Add_doLittle(this IServiceCollection services)
        {
            var logAppenders = LoggingConfigurator.DiscoverAndConfigure(Internals.LoggerFactory);

            doLittle.Logging.ILogger logger = new Logger(logAppenders);

            var assembliesConfigurationBuilder = new AssembliesConfigurationBuilder();

            assembliesConfigurationBuilder.IncludeAll();

            var contractToImplementorsMap = new ContractToImplementorsMap();
            var executingAssembly         = typeof(doLittleModule).GetTypeInfo().Assembly;

            contractToImplementorsMap.Feed(executingAssembly.GetTypes());

            var assemblySpecifiers = new AssemblySpecifiers(assembliesConfigurationBuilder.RuleBuilder, logger);

            assemblySpecifiers.SpecifyUsingSpecifiersFrom(executingAssembly);

            var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder);
            var assemblyFilters         = new AssemblyFilters(assembliesConfiguration);
            var assemblyProvider        = new AssemblyProvider(
                new ICanProvideAssemblies[] { new DefaultAssemblyProvider(logger) },
                assemblyFilters,
                new AssemblyUtility(),
                assemblySpecifiers);

            Internals.AllAssemblies           = assemblyProvider.GetAll();
            Internals.AssemblyFilters         = assemblyFilters;
            Internals.AssembliesConfiguration = assembliesConfiguration;
            Internals.AssemblyProvider        = assemblyProvider;
            Internals.Assemblies = new Assemblies(assemblyProvider);

            return(services);
        }
Exemple #9
0
        /// <summary>
        /// Adds the root assembly.
        /// </summary>
        /// <param name="assembly">The assembly.</param>
        private void addRootAssembly(AssemblyProvider assembly)
        {
            //register assembly
            _factory.Register(assembly.FullPath, assembly);

            //load assembly
            Loader.LoadRoot(assembly.FullPath);
        }
        /// <summary>
        /// Handler called for assembly that is invalidated.
        /// </summary>
        /// <param name="assembly">Invalidated assembly.</param>
        private void _onAssemblyInvalidation(AssemblyProvider assembly)
        {
            //remove invalidated assembly
            removeAssembly(assembly);

            //affected assemblies can try to reload assembly again
            reloadAffectedAssemblies(assembly.Key);
        }
        /// <summary>
        /// Given reference has been added into given <see cref="AssemblyProvider" />. If the
        /// referenced assembly doesnot exists it has to be loaded.
        /// </summary>
        /// <param name="assembly">Assembly which references changed.</param>
        /// <param name="reference">Reference that has been added into assembly.</param>
        private void _onReferenceAdded(AssemblyProvider assembly, object reference)
        {
            LoadReferenceAssembly(reference);
            //reloading of referencing

            Cache.Clear();
            CompositionSchemeInvalidation();
        }
Exemple #12
0
 /// <summary>
 /// Handler called on assembly removed.
 /// </summary>
 /// <param name="provider">The assembly provider.</param>
 private void onAssemblyRemoved(AssemblyProvider provider)
 {
     DispatchedAction(() =>
     {
         //TODO remove mapping changed handler
         _gui.Assemblies.RemoveItem(provider);
     });
 }
Exemple #13
0
        /// <summary>
        /// Removes the assembly from AppDomain.
        /// </summary>
        /// <param name="assembly">The assembly.</param>
        /// <returns>TestingAssembly.</returns>
        public TestingAssembly RemoveAssembly(AssemblyProvider assembly)
        {
            afterRuntimeAction(() =>
            {
                removeRootAssembly(assembly);
            });

            return(this);
        }
        /// <summary>
        /// Force invalidation of all components that are defined within given assembly.
        /// </summary>
        /// <param name="assembly">Assembly which components will be invalidated.</param>
        private void invalidateDefinedComponents(AssemblyProvider assembly)
        {
            var componentsCopy = GetComponents(assembly).ToArray();

            foreach (var component in componentsCopy)
            {
                invalidateComponent(assembly, component);
            }
        }
Exemple #15
0
 /// <summary>
 /// Handler called on assembly added.
 /// </summary>
 /// <param name="provider">The assembly provider.</param>
 private void onAssemblyAdded(AssemblyProvider provider)
 {
     DispatchedAction(() =>
     {
         var assemblyItem             = createAssemblyItem(provider);
         assemblyItem.MappingChanged += onAssemblyMappingChanged;
         _gui.Assemblies.AddItem(provider, assemblyItem);
     });
 }
        private static void RegisterPlugins(ContainerBuilder builder)
        {
            var assemblies = AssemblyProvider.GetAssemblies().ToArray();

            builder.RegisterAssemblyTypes(assemblies).As <IPromotionEntryCodes>().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(assemblies).As <IProductConverter>().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(assemblies).As <IAdConverter>().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(assemblies).As <IProductsAppender>().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(assemblies).As <IAdsAppender>().InstancePerLifetimeScope();
        }
 public IEnumerable <T> GetAll <T>() where T : IComposable
 {
     return(AssemblyProvider
            .GetAll()
            .SelectMany(a => a.Types)
            .Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && typeof(T).IsAssignableFrom(t))
            .Select(t => (T)Instantiator.Instantiate(t))
            .ToList()
            .AsReadOnly());
 }
        /// <summary>
        /// Handler fired whenever component is removed.
        /// </summary>
        /// <param name="assembly">Assembly where component has been defined.</param>
        /// <param name="removedComponent">Information about removed component.</param>
        private void _onComponentRemoved(AssemblyProvider assembly, ComponentInfo removedComponent)
        {
            _assemblyComponents.Remove(assembly, removedComponent);
            _components.Remove(removedComponent.ComponentType);

            if (ComponentRemoved != null)
            {
                ComponentRemoved(removedComponent);
            }
        }
        /// <summary>
        /// Try to resolve static (generic/non-generic) method.
        /// </summary>
        /// <param name="method">Method that is resolved.</param>
        /// <param name="definingAssembly">Assembly where method is defined.</param>
        /// <returns>Resolved method if available, <c>null</c> otherwise.</returns>
        private GeneratorBase tryStaticResolve(MethodID method, out AssemblyProvider definingAssembly)
        {
            var result = tryStaticExplicitResolve(method, out definingAssembly);

            if (result == null)
            {
                result = tryStaticGenericResolve(method, out definingAssembly);
            }

            return(result);
        }
        /// <summary>
        /// Get components defined within given assembly and its referenced assemblies.
        /// </summary>
        /// <param name="assembly">Assembly where components are searched.</param>
        /// <returns>Components defined within assembly.</returns>
        internal IEnumerable <ComponentInfo> GetReferencedComponents(AssemblyProvider assembly)
        {
            var result = new List <ComponentInfo>();

            foreach (var reference in resolveKeys(assembly.References))
            {
                result.AddRange(GetComponents(reference));
            }

            return(result);
        }
        public ResourceContentProviderTests()
        {
            var assemblyProvider = new AssemblyProvider
            {
                Assemblies = new[]
                {
                    typeof(ResourceContentProviderTests).GetTypeInfo().Assembly
                }
            };

            _underTest = new ResourceContentProvider(assemblyProvider, new StackTraceProvider(), new MethodDetailsFilter(assemblyProvider));
        }
Exemple #22
0
        /// <summary>
        /// Gets the type assembly.
        /// </summary>
        /// <param name="assemblyProvider">The assembly provider.</param>
        /// <returns>TypeAssembly.</returns>
        internal TypeAssembly GetTypeAssembly(AssemblyProvider assemblyProvider)
        {
            if (assemblyProvider == null)
            {
                return(null);
            }

            TypeAssembly typeAssembly;

            _assemblies.TryGetValue(assemblyProvider, out typeAssembly);

            return(typeAssembly);
        }
Exemple #23
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DefaultAssemblyProvider"/> class.
        /// </summary>
        public DefaultAssemblyProvider()
        {
            var localAssemblies = AppDomain.CurrentDomain.GetAssemblies()
                                  .Where(x => x.GetTypes()
                                         .Where(t => string.IsNullOrEmpty(t.Namespace) == false)
                                         .Where(t => t.Namespace.StartsWith(nameof(ConnectedDevelopment), StringComparison.OrdinalIgnoreCase))
                                         .Any() == true)
                                  .ToList();

            var provider = new AssemblyProvider(localAssemblies);

            _provider = provider;
        }
Exemple #24
0
        /// <summary>
        /// Unregister given assembly if needed from storage.
        /// </summary>
        /// <param name="assembly">Unregistered assembly.</param>
        private void unregisterAssembly(AssemblyProvider assembly)
        {
            if (_assemblies.Remove(assembly))
            {
                _assemblyPathIndex.Remove(assembly.FullPath);
                _assemblyKeyIndex.Remove(assembly.Key);

                if (OnUnRegistered != null)
                {
                    OnUnRegistered(assembly);
                }
            }
        }
Exemple #25
0
        /// <summary>
        /// Configure by letting Bifrost discover anything that implements the discoverable configuration interfaces
        /// </summary>
        /// <returns></returns>
        public static Configure DiscoverAndConfigure(Action <AssembliesConfigurationBuilder> assembliesConfigurationBuilderCallback = null, IEnumerable <ICanProvideAssemblies> additionalAssemblyProviders = null)
        {
            IContractToImplementorsMap contractToImplementorsMap;
            var assembliesConfigurationBuilder = BuildAssembliesConfigurationIfCallbackDefined(assembliesConfigurationBuilderCallback);

            contractToImplementorsMap = new ContractToImplementorsMap();
            var executingAssembly = typeof(Configure).GetTypeInfo().Assembly;

            contractToImplementorsMap.Feed(executingAssembly.GetTypes());
            var assemblySpecifiers = new AssemblySpecifiers(contractToImplementorsMap, new TypeFinder(), assembliesConfigurationBuilder.RuleBuilder);

            assemblySpecifiers.SpecifyUsingSpecifiersFrom(executingAssembly);

            var assemblyProviders = new List <ICanProvideAssemblies>
            {
#if (NET461)
                new AppDomainAssemblyProvider(),
#endif
                //new DefaultAssemblyProvider()
                new FileSystemAssemblyProvider(new FileSystem())
            };


            if (additionalAssemblyProviders != null)
            {
                assemblyProviders.AddRange(additionalAssemblyProviders);
            }

            var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder);
            var assemblyProvider        = new AssemblyProvider(
                assemblyProviders,
                new AssemblyFilters(assembliesConfiguration),
                new AssemblyUtility(),
                assemblySpecifiers,
                contractToImplementorsMap);

            var assemblies = assemblyProvider.GetAll();

            var canCreateContainerType = DiscoverCanCreateContainerType(assemblies);

            ThrowIfCanCreateContainerNotFound(canCreateContainerType);
            ThrowIfCanCreateContainerDoesNotHaveDefaultConstructor(canCreateContainerType);
            var canCreateContainerInstance = Activator.CreateInstance(canCreateContainerType) as ICanCreateContainer;
            var container = canCreateContainerInstance.CreateContainer();
            var configure = With(container, BindingLifecycle.Transient, assembliesConfiguration, assemblyProvider, contractToImplementorsMap);

            configure.EntryAssembly = canCreateContainerType.GetTypeInfo().Assembly;
            configure.Initialize();
            return(configure);
        }
Exemple #26
0
        /// <summary>
        /// Adds specified assembly to the AppDomain.
        /// </summary>
        /// <param name="testAssembly">The test assembly.</param>
        /// <returns>TestingAssembly.</returns>
        public TestingAssembly AddAssembly(AssemblyProvider testAssembly)
        {
            afterRuntimeAction(() =>
            {
                addRootAssembly(testAssembly);
                var runtime = testAssembly as RuntimeAssembly;
                if (runtime != null)
                {
                    runtime.BuildAssembly();
                }
            });

            return(this);
        }
Exemple #27
0
        /// <summary>
        /// Add root assembly which composition points are displayed to the user. It
        /// will be present within AppDomain until explicit unload.
        /// </summary>
        /// <param name="assembly">Added assembly.</param>
        internal void AddRoot(AssemblyProvider assembly)
        {
            if (!_rootAssemblies.Add(assembly))
            {
                //assembly is already contained
                return;
            }

            registerAssembly(assembly);

            if (OnRootAdd != null)
            {
                OnRootAdd(assembly);
            }
        }
        /// <summary>
        /// Resolve method generator with exact method ID (no generic method searches).
        /// </summary>
        /// <param name="method">Resolved method.</param>
        /// <param name="definingAssembly">Assembly where method is defined.</param>
        /// <returns>Generator for resolved method, or null, if there is no available generator.</returns>
        private GeneratorBase tryStaticExplicitResolve(MethodID method, out AssemblyProvider definingAssembly)
        {
            foreach (var assembly in _assemblies.Providers)
            {
                var generator = assembly.GetMethodGenerator(method);

                if (generator != null)
                {
                    definingAssembly = assembly;
                    return(generator);
                }
            }
            definingAssembly = null;
            return(null);
        }
Exemple #29
0
        public void DeepClone()
        {
            var    item   = new AssemblyProvider().GetAssemblies();
            Person person = new Person
            {
                Name   = "小明",
                Gender = Gender.Boy
            };
            var newPerson = person.DeepClone(person);

            newPerson.Name = "小明哥";
            var newPerson2 = person.ShallowClone <Person>();

            Check.True(person.Name != newPerson.Name, "方法有误");
            Check.True(person.Name == newPerson2.Name, "方法有误");
        }
Exemple #30
0
        /// <summary>
        /// Handler called on the host path changed.
        /// </summary>
        /// <param name="path">The path.</param>
        void onHostPathChanged(string path)
        {
            _vs.SafeRunAction(() =>
            {
                //unload old assembly if available
                if (_hostAssembly != null)
                {
                    var unloadTransaction = _appDomain.Transactions.StartNew("Unloading host assembly");
                    try
                    {
                        if (HostAssemblyUnLoaded != null)
                        {
                            HostAssemblyUnLoaded(_hostAssembly);
                        }

                        _appDomain.Loader.UnloadRoot(_hostAssembly.FullPath);

                        _hostAssembly = null;
                    }
                    finally
                    {
                        unloadTransaction.Commit();
                    }
                }

                if (path == null)
                {
                    return;
                }

                var loadTransaction = _appDomain.Transactions.StartNew("Unloading host assembly");
                try
                {
                    //load assembly according to new path
                    _hostAssembly = _appDomain.Loader.LoadRoot(path);
                    if (_hostAssembly != null && HostAssemblyLoaded != null)
                    {
                        HostAssemblyLoaded(_hostAssembly);
                    }
                }
                finally
                {
                    loadTransaction.Commit();
                }
            }, "Changing host assembly path");
        }