diff --git a/UnitOfWork.NET/Classes/UnitOfWork.cs b/UnitOfWork.NET/Classes/UnitOfWork.cs index 7ab4913..d6ea4fc 100644 --- a/UnitOfWork.NET/Classes/UnitOfWork.cs +++ b/UnitOfWork.NET/Classes/UnitOfWork.cs @@ -8,110 +8,131 @@ namespace UnitOfWork.NET.Classes { - public class UnitOfWork : IUnitOfWork - { - private readonly ObservableCollection _assemblies; - private readonly IContainer _container; - - public UnitOfWork() - { - _assemblies = new ObservableCollection(); - - var cb = new ContainerBuilder(); - - cb.Register(t => this).AsImplementedInterfaces().AsSelf().As(); - cb.RegisterType().AsSelf().As().PreserveExistingDefaults(); - cb.RegisterGeneric(typeof(Repository<>)).AsSelf().As(typeof(IRepository<>)); - cb.RegisterGeneric(typeof(Repository<,>)).AsSelf().As(typeof(IRepository<,>)); - cb.RegisterGeneric(typeof(Repository<,,>)).AsSelf().As(typeof(IListRepository<,,>)); - - _container = cb.Build(); - - cb = new ContainerBuilder(); - - var fields = GetType().GetFields().ToArray(); - var properties = GetType().GetProperties().ToArray(); - - foreach (var type in fields.Select(t => t.FieldType).Union(properties.Select(t => t.PropertyType)).Where(IsRepository)) cb.RegisterType(type).AsSelf().AsImplementedInterfaces(); - - cb.Update(_container); - - foreach (var field in fields.Where(t => t.FieldType.IsAssignableTo())) field.SetValue(this, _container.ResolveOptional(field.FieldType)); - foreach (var property in properties.Where(t => t.PropertyType.IsAssignableTo())) property.SetValue(this, _container.ResolveOptional(property.PropertyType)); - - _assemblies.CollectionChanged += (sender, args) => RegisterAssembly(args.NewItems.Cast().ToArray()); - - foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) _assemblies.Add(assembly); - } - - private bool IsRepository(Type t) - { - try - { - return t.IsAssignableTo() && !t.IsInterface && !t.IsAbstract && t != typeof(Repository) && ((t.IsGenericType && t.GetGenericTypeDefinition() != typeof(Repository<>) && t.GetGenericTypeDefinition() != typeof(Repository<,>) && t.GetGenericTypeDefinition() != typeof(Repository<,,>)) || !t.IsGenericType) && !_container.IsRegistered(t); - } - catch - { - return false; - } - } - - private void RegisterAssembly(Assembly[] assemblyArr) - { - var cb = new ContainerBuilder(); - - cb.RegisterAssemblyTypes(assemblyArr.Where(t => t.GetTypes().Any(IsRepository)).ToArray()).Where(IsRepository).AsSelf().AsImplementedInterfaces(); - cb.Update(_container); - - foreach (var assembly in assemblyArr.SelectMany(t => t.GetReferencedAssemblies()).Select(Assembly.Load).Where(t => !_assemblies.Contains(t) && t.GetTypes().Any(IsRepository))) - _assemblies.Add(assembly); - } - - public void RegisterRepository() where TRepository : IRepository => RegisterRepository(typeof(TRepository)); - - public void RegisterRepositories(Type[] repositoryTypes) - { - var cb = new ContainerBuilder(); - - foreach (var repositoryType in repositoryTypes) - { - if (repositoryType.IsInterface || repositoryType.IsAbstract || _container.IsRegistered(repositoryType)) continue; - - if (repositoryType.IsGenericTypeDefinition) - cb.RegisterGeneric(repositoryType).AsSelf().AsImplementedInterfaces(); - else - cb.RegisterType(repositoryType).AsSelf().AsImplementedInterfaces(); - } - - cb.Update(_container); - } - - public void RegisterRepository(Type repositoryType) - { - RegisterRepositories(new[] { repositoryType }); - } - - private TRepository GetRepository() where TRepository : IRepository - { - RegisterRepository(); - - return _container.Resolve(); - } - - public TRepository CustomRepository() where TRepository : IRepository => GetRepository(); - - public IRepository Repository() where T : class => GetRepository>(); - - public IRepository Repository() where TSource : class where TDestination : class => GetRepository>(); - - public IListRepository Repository() where TSource : class where TDestination : class where TListDestination : class => GetRepository>(); - - public virtual IEnumerable Data() where T : class => Enumerable.Empty(); - - public virtual void Dispose() - { - _container.Dispose(); - } - } + public class UnitOfWork : IUnitOfWork + { + private readonly ObservableCollection _assemblies; + private readonly IContainer _container; + + public UnitOfWork() + { + _assemblies = new ObservableCollection(); + + var cb = new ContainerBuilder(); + + cb.Register(t => this).AsImplementedInterfaces().AsSelf().As(); + cb.RegisterType().AsSelf().As().PreserveExistingDefaults(); + cb.RegisterGeneric(typeof(Repository<>)).AsSelf().As(typeof(IRepository<>)); + cb.RegisterGeneric(typeof(Repository<,>)).AsSelf().As(typeof(IRepository<,>)); + cb.RegisterGeneric(typeof(Repository<,,>)).AsSelf().As(typeof(IListRepository<,,>)); + + _container = cb.Build(); + + cb = new ContainerBuilder(); + + var fields = GetType().GetFields().ToArray(); + var properties = GetType().GetProperties().ToArray(); + + foreach (var type in fields.Select(t => t.FieldType).Union(properties.Select(t => t.PropertyType)).Where(IsRepository)) cb.RegisterType(type).AsSelf().AsImplementedInterfaces(); + + cb.Update(_container); + + foreach (var field in fields.Where(t => t.FieldType.IsAssignableTo())) field.SetValue(this, _container.ResolveOptional(field.FieldType)); + foreach (var property in properties.Where(t => t.PropertyType.IsAssignableTo())) property.SetValue(this, _container.ResolveOptional(property.PropertyType)); + + _assemblies.CollectionChanged += (sender, args) => RegisterAssembly(args.NewItems.Cast().ToArray()); + + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) _assemblies.Add(assembly); + } + + private bool IsRepository(Type t) + { + try + { + return t.IsAssignableTo() && !t.IsInterface && !t.IsAbstract && t != typeof(Repository) && ((t.IsGenericType && t.GetGenericTypeDefinition() != typeof(Repository<>) && t.GetGenericTypeDefinition() != typeof(Repository<,>) && t.GetGenericTypeDefinition() != typeof(Repository<,,>)) || !t.IsGenericType) && !_container.IsRegistered(t); + } + catch + { + return false; + } + } + + private void RegisterAssembly(Assembly[] assemblyArr) + { + var cb = new ContainerBuilder(); + + cb.RegisterAssemblyTypes(assemblyArr.Where(t => + { + try + { + return t.GetTypes().Any(IsRepository); + } + catch + { + return false; + } + }).ToArray()).Where(IsRepository).AsSelf().AsImplementedInterfaces(); + cb.Update(_container); + + foreach (var assembly in assemblyArr.SelectMany(t => t.GetReferencedAssemblies()).Select(Assembly.Load).Where( + t => + { + try + { + return !_assemblies.Contains(t) && t.GetTypes().Any(IsRepository); + } + catch + { + return false; + } + })) + _assemblies.Add(assembly); + } + + public void RegisterRepository() where TRepository : IRepository => RegisterRepository(typeof(TRepository)); + + public void RegisterRepositories(Type[] repositoryTypes) + { + var cb = new ContainerBuilder(); + + foreach (var repositoryType in repositoryTypes) + { + if (repositoryType.IsInterface || repositoryType.IsAbstract || _container.IsRegistered(repositoryType)) continue; + + if (repositoryType.IsGenericTypeDefinition) + cb.RegisterGeneric(repositoryType).AsSelf().AsImplementedInterfaces(); + else + cb.RegisterType(repositoryType).AsSelf().AsImplementedInterfaces(); + } + + cb.Update(_container); + } + + public void RegisterRepository(Type repositoryType) + { + RegisterRepositories(new[] { repositoryType }); + } + + private TRepository GetRepository() where TRepository : IRepository + { + RegisterRepository(); + + return _container.Resolve(); + } + + public TRepository CustomRepository() where TRepository : IRepository => GetRepository(); + + public IRepository Repository() where T : class => GetRepository>(); + + public IRepository Repository() where TSource : class where TDestination : class => GetRepository>(); + + public IListRepository Repository() where TSource : class where TDestination : class where TListDestination : class => GetRepository>(); + + public virtual IEnumerable Data() where T : class => Enumerable.Empty(); + + public virtual void Dispose() + { + _container.Dispose(); + } + } }