Example #1
0
 private void Employees_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 {
     switch (e.Action)
     {
     case NotifyCollectionChangedAction.Add:
         var dto = (EmployeeDataTransfer)e.NewItems[0];
         if (!Added.Contains(dto))
         {
             Added.Add((EmployeeDataTransfer)e.NewItems[0]);
         }
         break;
     }
 }
Example #2
0
        /// <summary>
        /// Merges a <see cref="ModelValueChangeEvent"/> into the current event.
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        protected override bool OnMerge(ModelEvent e)
        {
            // Ensure the events are for the same reference property
            var listChange = (ModelListChangeEvent)e;

            if (listChange.Property != Property)
            {
                return(false);
            }

            // Highly likely not to be right
            var mergeAdded = Added.ToList();

            mergeAdded.RemoveAll(i => listChange.Removed.Contains(i));

            var mergeRemoved = Removed.ToList();

            mergeRemoved.RemoveAll(i => listChange.Added.Contains(i));

            mergeAdded   = mergeAdded.Union(listChange.Added.Where(i => !Removed.Contains(i))).ToList();
            mergeRemoved = mergeRemoved.Union(listChange.Removed.Where(i => !Added.Contains(i))).ToList();

            Added   = mergeAdded.ToArray();
            Removed = mergeRemoved.ToArray();


            var mergeAddedIds = AddedIds.ToList();

            mergeAddedIds.RemoveAll(i => listChange.RemovedIds.Contains(i));

            var mergeRemovedIds = RemovedIds.ToList();

            mergeRemovedIds.RemoveAll(i => listChange.AddedIds.Contains(i));

            mergeAddedIds   = mergeAddedIds.Union(listChange.AddedIds.Where(i => !RemovedIds.Contains(i))).ToList();
            mergeRemovedIds = mergeRemovedIds.Union(listChange.RemovedIds.Where(i => !AddedIds.Contains(i))).ToList();

            AddedIds   = mergeAddedIds.ToArray();
            RemovedIds = mergeRemovedIds.ToArray();

            return(true);
        }
Example #3
0
        public bool TryAdd(Type service, Type implementation = null)
        {
            if (service.IsInterface && service.IsGenericType && implementation == null &&
                (service.GetGenericTypeDefinition() == typeof(IOptionsSnapshot <>) ||
                 service.GetGenericTypeDefinition() == typeof(IOptions <>) ||
                 service.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>)
                ))
            {
                service = service.GetGenericArguments().FirstOrDefault();
                if (service == null)
                {
                    return(false);
                }
            }

            var serviceName = $"{service}{implementation}";

            if (Added.Contains(serviceName))
            {
                return(false);
            }
            Added.Add(serviceName);

            var di = service.IsGenericType && (
                service.GetGenericTypeDefinition() == typeof(IConfigureOptions <>) ||
                service.GetGenericTypeDefinition() == typeof(IPostConfigureOptions <>) ||
                service.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>)
                ) && implementation != null?implementation.GetCustomAttribute <DIAttribute>() : service.GetCustomAttribute <DIAttribute>();

            var isnew = false;

            if (di != null)
            {
                if (di.Additional != null)
                {
                    var m = di.Additional.GetMethod("Register", BindingFlags.Public | BindingFlags.Static);
                    m.Invoke(null, new[] { this });
                }

                if (!service.IsInterface || implementation != null)
                {
                    isnew = implementation != null?Register(service, implementation) : Register(service);

                    if (!isnew)
                    {
                        return(false);
                    }
                }

                if (service.IsInterface && implementation == null || !service.IsInterface)
                {
                    if (di.Service != null)
                    {
                        var a = di.Service.GetInterfaces().FirstOrDefault(x => x.IsGenericType && (
                                                                              x.GetGenericTypeDefinition() == typeof(IConfigureOptions <>) ||
                                                                              x.GetGenericTypeDefinition() == typeof(IPostConfigureOptions <>) ||
                                                                              x.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>)
                                                                              ));
                        if (a != null)
                        {
                            if (!a.ContainsGenericParameters)
                            {
                                var b = a.GetGenericArguments();

                                foreach (var g in b)
                                {
                                    if (g != service)
                                    {
                                        TryAdd(g);
                                        if (service.IsInterface && di.Implementation == null)
                                        {
                                            TryAdd(service, g);
                                        }
                                    }
                                }

                                TryAdd(a, di.Service);
                            }
                            else
                            {
                                Type c  = null;
                                var  a1 = a.GetGenericTypeDefinition();
                                var  b  = a.GetGenericArguments().FirstOrDefault();

                                if (b != null && b.IsGenericType)
                                {
                                    var b1 = b.GetGenericTypeDefinition().MakeGenericType(service.GetGenericArguments());

                                    TryAdd(b1);
                                    c = a1.MakeGenericType(b1);
                                }
                                else
                                {
                                    c = a1.MakeGenericType(service.GetGenericArguments());
                                }

                                TryAdd(c, di.Service.MakeGenericType(service.GetGenericArguments()));
                                //a, di.Service
                            }
                        }
                        else
                        {
                            if (di.Implementation == null)
                            {
                                isnew = Register(service, di.Service);
                                TryAdd(di.Service);
                            }
                            else
                            {
                                Register(di.Service);
                            }
                        }
                    }

                    if (di.Implementation != null)
                    {
                        var a = di.Implementation.GetInterfaces().FirstOrDefault(x => x.IsGenericType &&
                                                                                 (x.GetGenericTypeDefinition() == typeof(IConfigureOptions <>) ||
                                                                                  x.GetGenericTypeDefinition() == typeof(IPostConfigureOptions <>) ||
                                                                                  x.GetGenericTypeDefinition() == typeof(IOptionsMonitor <>))
                                                                                 );
                        if (a != null)
                        {
                            if (!a.ContainsGenericParameters)
                            {
                                var b = a.GetGenericArguments();

                                foreach (var g in b)
                                {
                                    if (g != service)
                                    {
                                        //TryAdd(g);
                                        if (service.IsInterface && implementation == null)
                                        {
                                            TryAdd(service, g);
                                        }
                                    }
                                }

                                TryAdd(a, di.Implementation);
                            }
                            else
                            {
                                Type c  = null;
                                var  a1 = a.GetGenericTypeDefinition();
                                var  b  = a.GetGenericArguments().FirstOrDefault();

                                if (b != null && b.IsGenericType)
                                {
                                    var b1 = b.GetGenericTypeDefinition().MakeGenericType(service.GetGenericArguments());

                                    TryAdd(b1);
                                    c = a1.MakeGenericType(b1);
                                }
                                else
                                {
                                    c = a1.MakeGenericType(service.GetGenericArguments());
                                }

                                TryAdd(c, di.Implementation.MakeGenericType(service.GetGenericArguments()));
                                //a, di.Service
                            }
                        }
                        else
                        {
                            isnew = TryAdd(service, di.Implementation);
                        }
                    }
                }
            }

            if (isnew)
            {
                ConstructorInfo[] props = null;

                if (!service.IsInterface)
                {
                    props = service.GetConstructors();
                }
                else if (implementation != null)
                {
                    props = implementation.GetConstructors();
                }
                else if (di.Service != null)
                {
                    props = di.Service.GetConstructors();
                }

                if (props != null)
                {
                    var par = props.SelectMany(r => r.GetParameters()).Distinct();
                    foreach (var p1 in par)
                    {
                        TryAdd(p1.ParameterType);
                    }
                }
            }

            return(isnew);
        }