Example #1
0
        public Dictionary <Type, List <Type> > FindImplementations <TInterface>(Func <Type, Type, bool> filter)
        {
            var implementations = Container.Resolve <TInterface>();

            var implDict = new Dictionary <Type, List <ConceptImplementation <TInterface> > >();

            foreach (var impl in implementations)
            {
                var ci = new ConceptImplementation <TInterface>(impl);
                if (ci.ImplementsType != null)
                {
                    List <ConceptImplementation <TInterface> > conceptImplList;
                    if (!filter(ci.Type, ci.ImplementsType))
                    {
                        continue;
                    }

                    if (!implDict.TryGetValue(ci.ImplementsType, out conceptImplList))
                    {
                        implDict.Add(ci.ImplementsType, conceptImplList = new List <ConceptImplementation <TInterface> >());
                    }
                    conceptImplList.Add(ci);
                }
            }

            var dict = new Dictionary <Type, List <Type> >();

            foreach (var type in implDict.Keys)
            {
                var list         = implDict[type];
                var conceptImpls = list.Count > 1 ? Sort(list.ToDictionary(it => it.Type)).ToList() : list;
                dict.Add(type, new List <Type>(UseInsteadOfImplementations(conceptImpls).Select(ci => ci.Type)));
            }
            return(dict);
        }
Example #2
0
        public IEnumerable <Type> FindPlugins <TService>(Func <Type, Type, bool> filter)
        {
            var implementations = Container.Resolve <TService>();
            var dict            = new Dictionary <Type, ConceptImplementation <TService> >();

            try
            {
                foreach (var impl in implementations)
                {
                    var ci = new ConceptImplementation <TService>(impl);
                    if (filter(ci.Type, ci.ImplementsType))
                    {
                        dict[ci.Type] = ci;
                    }
                }
            }
            catch (DependencyResolutionException ex)
            {
                if (ex.InnerException != null)
                {
                    throw new FrameworkException("Error loading plugins for " + typeof(TService).FullName + ". " + ex.InnerException.Message, ex.InnerException);
                }
                throw new FrameworkException("Error loading plugins for " + typeof(TService).FullName, ex);
            }

            return(Sort(dict).Select(ci => ci.Type).ToList());
        }
Example #3
0
        public IEnumerable <Type> FindPlugins <TService>(Func <Type, Type, bool> filter)
        {
            var implementations = Container.Resolve <TService>();
            var dict            = new Dictionary <Type, ConceptImplementation <TService> >();

            try
            {
                foreach (var impl in implementations)
                {
                    object md;
                    if (impl.Metadata.TryGetValue(Metadata.Implements, out md))
                    {
                        var multiple = md as Type[] ?? new[] { md as Type };
                        foreach (var type in multiple)
                        {
                            var ci = new ConceptImplementation <TService>(impl, type);
                            if (filter(ci.Type, type))
                            {
                                dict[ci.Type] = ci;
                            }
                        }
                    }
                    else
                    {
                        var ci = new ConceptImplementation <TService>(impl, null);
                        if (filter(ci.Type, null))
                        {
                            dict[ci.Type] = ci;
                        }
                    }
                }
            }
            catch (DependencyResolutionException ex)
            {
                if (ex.InnerException != null)
                {
                    throw new FrameworkException("Error loading plugins for " + typeof(TService).FullName + ". " + ex.InnerException.Message, ex.InnerException);
                }
                throw new FrameworkException("Error loading plugins for " + typeof(TService).FullName, ex);
            }

            return(Sort(dict).Select(ci => ci.Type).ToList());
        }
Example #4
0
 /// <summary>
 /// For logging.
 /// </summary>
 public override string ToString() => ConceptInfo.GetKey() + "/" + ConceptImplementation.GetType().Name;