Exemplo n.º 1
0
        public ContainerRegistry()
        {
            Scan(scan =>
            {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();

                scan.ConnectImplementationsToTypesClosing(typeof (IQueryHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof (ICommandHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(EntityDeleter<>));
            });

            For<UnitOfWork>()
                .LifecycleIs(new InteractionScopeLifecycle())
                .Use<Pragmatic.EntityFramework.UnitOfWork>();

            For<DbContext>()
                .LifecycleIs(new InteractionScopeLifecycle())
                .Use(() => new ExampleDbContext());

            var standardInteractionHandlerGenericTypeDefinitions = new StandardInteractionHandlerGenericTypeDefinitions
                (
                    typeof(GetByIdQueryHandler<>),
                    typeof(GetOneQueryHandler<>),
                    typeof(GetAllQueryHandler<>),
                    typeof(GetTotalCountQueryHandler<>)
                );

            StandardInteractionHandlerRegistration.RegisterStandardInteractionHandlersForEntities(this, standardInteractionHandlerGenericTypeDefinitions);
            StandardInteractionHandlerRegistration.RegisterStandardNonGenericGetByIdQueryHandler(this, typeof(GetByIdQueryHandler));

            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleDbContext>());
        }
        public static void RegisterStandardInteractionHandlersForEntities(Registry registry, StandardInteractionHandlerGenericTypeDefinitions standardInteractionHandlerGenericTypeDefinitions, params Assembly[] assembliesContainingEntities)
        {
            Argument.IsNotNull(registry, "registry");
            Argument.IsNotNull(standardInteractionHandlerGenericTypeDefinitions, "standardInteractionHandlerGenericTypeDefinitions");
            Argument.IsNotNull(assembliesContainingEntities, "assembliesContainingEntities");
            Argument.IsValid(assembliesContainingEntities.Length > 0,
                             "The array of assemblies that contain entities is empty. The array must have at least one assembly specified.",
                             "assembliesContainingEntities");

            var entityTypes = assembliesContainingEntities.SelectMany(assembly => assembly.GetTypes().Where(type => type != typeof(Entity) && typeof(Entity).IsAssignableFrom(type)));

            foreach (var entityType in entityTypes) // E.g. User.
            {
                // E.g. IQueryHandler<GetByIdQuery<User>, Option<User>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetByIdQuery<>), typeof(Option<>).MakeGenericType(entityType), standardInteractionHandlerGenericTypeDefinitions.GetByIdQueryHandler, entityType);
                // E.g. IQueryHandler<GetOneQuery<User>, Option<User>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetOneQuery<>), typeof(Option<>).MakeGenericType(entityType), standardInteractionHandlerGenericTypeDefinitions.GetOneQueryHandler, entityType);
                // E.g. IQueryHandler<GetAllQuery<User>, IPagedEnumerable<User>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetAllQuery<>), typeof(IPagedEnumerable<>).MakeGenericType(entityType), standardInteractionHandlerGenericTypeDefinitions.GetAllQueryHandler, entityType);
                // E.g. IQueryHandler<GetTotalCountQuery<User>, int>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetTotalCountQuery<>), typeof(int), standardInteractionHandlerGenericTypeDefinitions.GetTotalCountQueryHandler, entityType);

                // E.g. IRequestHandler<CanDeleteEntityRequest<User>, Response<Option<User>>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IRequestHandler<,>), typeof(CanDeleteEntityRequest<>), typeof(Response<>).MakeGenericType(typeof(Option<>).MakeGenericType(entityType)), standardInteractionHandlerGenericTypeDefinitions.CanDeleteEntityRequestHandler, entityType);

                // E.g. ICommandHandler<DeleteEntityCommand<User>, Response>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(ICommandHandler<,>), typeof(DeleteEntityCommand<>), typeof(Response), standardInteractionHandlerGenericTypeDefinitions.DeleteEntityCommandHandler, entityType);
            }
        }
        public static void RegisterStandardInteractionHandlersForEntities(Registry registry, StandardInteractionHandlerGenericTypeDefinitions standardInteractionHandlerGenericTypeDefinitions)
        {
            Argument.IsNotNull(registry, "registry");
            Argument.IsNotNull(standardInteractionHandlerGenericTypeDefinitions, "standardInteractionHandlerGenericTypeDefinitions");

            foreach (var entityType in PragmaticEnvironment.EntityAssemblies.EntityTypes) // E.g. User.
            {
                // E.g. IQueryHandler<GetByIdQuery<User>, Option<User>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetByIdQuery<>), typeof(Option<>).MakeGenericType(entityType), standardInteractionHandlerGenericTypeDefinitions.GetByIdQueryHandler, entityType);
                // E.g. IQueryHandler<GetOneQuery<User>, Option<User>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetOneQuery<>), typeof(Option<>).MakeGenericType(entityType), standardInteractionHandlerGenericTypeDefinitions.GetOneQueryHandler, entityType);
                // E.g. IQueryHandler<GetAllQuery<User>, IPagedEnumerable<User>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetAllQuery<>), typeof(IPagedEnumerable<>).MakeGenericType(entityType), standardInteractionHandlerGenericTypeDefinitions.GetAllQueryHandler, entityType);
                // E.g. IQueryHandler<GetTotalCountQuery<User>, int>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IQueryHandler<,>), typeof(GetTotalCountQuery<>), typeof(int), standardInteractionHandlerGenericTypeDefinitions.GetTotalCountQueryHandler, entityType);

                // E.g. IRequestHandler<CanDeleteEntityRequest<User>, Response<Option<User>>>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(IRequestHandler<,>), typeof(CanDeleteEntityRequest<>), typeof(Response<>).MakeGenericType(typeof(Option<>).MakeGenericType(entityType)), standardInteractionHandlerGenericTypeDefinitions.CanDeleteEntityRequestHandler, entityType);

                // E.g. ICommandHandler<DeleteEntityCommand<User>, Response>.
                ConnectInteractionHandlerToStandardInteractionForEntityType(registry, typeof(ICommandHandler<,>), typeof(DeleteEntityCommand<>), typeof(Response), standardInteractionHandlerGenericTypeDefinitions.DeleteEntityCommandHandler, entityType);
            }
        }
Exemplo n.º 4
0
        private ContainerRegistry()
        {
            Scan(scan =>
            {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();

                scan.AssemblyContainingType<Entity>();
                scan.AssemblyContainingType<User>();

                scan.ConnectImplementationsToTypesClosing(typeof(ICommandHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IQueryHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IValidator<>));
                scan.ConnectImplementationsToTypesClosing(typeof(EntityDeleter<>));
            });

            For<IResponseMapper>().Use(new InvariantResponseMapper());

            var structureMapInteractionObjectResolver = new StructureMapInteractionObjectResolver();
            For<IInteractionHandlerResolver>().Use(structureMapInteractionObjectResolver);
            For<IEntityDeleterResolver>().Use(structureMapInteractionObjectResolver);

            // Register query handlers for standard queries. WARNING: Intentionally Bad Code!
            StandardInteractionHandlerGenericTypeDefinitions standardInteractionHandlerGenericTypeDefinitions;
            if (UnitOfWorkFactory.DefaultUnitOfWorkType == typeof(Raven.UnitOfWork))
            {
                standardInteractionHandlerGenericTypeDefinitions = new StandardInteractionHandlerGenericTypeDefinitions
                    (
                    typeof(GetByIdQueryHandler<>),
                    typeof(GetOneQueryHandler<>),
                    typeof(GetAllQueryHandler<>),
                    typeof(GetTotalCountQueryHandler<>)
                    );
            }
            else
            {
                standardInteractionHandlerGenericTypeDefinitions = new StandardInteractionHandlerGenericTypeDefinitions
                (
                    typeof(NHibernate.Interaction.StandardQueries.GetByIdQueryHandler<>),
                    typeof(NHibernate.Interaction.StandardQueries.GetOneQueryHandler<>),
                    typeof(NHibernate.Interaction.StandardQueries.GetAllQueryHandler<>),
                    typeof(NHibernate.Interaction.StandardQueries.GetTotalCountQueryHandler<>)
                );
            }

            StandardInteractionHandlerRegistration.RegisterStandardInteractionHandlersForEntities(this, standardInteractionHandlerGenericTypeDefinitions, typeof(User).Assembly);

            For<UnitOfWork>()
                .LifecycleIs(new InteractionScopeLifecycle())
                .Use(() => UnitOfWorkFactory.CreateUnitOfWork());

            IncludeRegistry<RavenContainerRegistry>();
            IncludeRegistry<NHibernateContainerRegistry>();
        }
Exemplo n.º 5
0
        private ContainerRegistry()
        {
            Scan(scan =>
            {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();

                scan.AssemblyContainingType<Entity>();
                scan.AssemblyContainingType<User>();

                scan.ConnectImplementationsToTypesClosing(typeof(ICommandHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IQueryHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IValidator<>));
                scan.ConnectImplementationsToTypesClosing(typeof(EntityDeleter<>));
            });

            For<IResponseMapper>().Use(new InvariantResponseMapper());

            var structureMapInteractionObjectResolver = new StructureMapInteractionObjectResolver();
            For<IInteractionHandlerResolver>().Use(structureMapInteractionObjectResolver);
            For<IEntityDeleterResolver>().Use(structureMapInteractionObjectResolver);
            For<IQueryResultCacheResolver>().Use(structureMapInteractionObjectResolver);

            // Register query handlers for standard queries. WARNING: Intentionally Bad Code!
            StandardInteractionHandlerGenericTypeDefinitions standardInteractionHandlerGenericTypeDefinitions;
            if (UnitOfWorkFactory.DefaultUnitOfWorkType == typeof(Raven.UnitOfWork))
            {
                For<IQueryHandler<GetByIdQuery, Option<object>>>().Singleton().Use<RavenStandardQueries.GetByIdQueryHandler>();
                standardInteractionHandlerGenericTypeDefinitions = new StandardInteractionHandlerGenericTypeDefinitions
                    (
                    typeof(RavenStandardQueries.GetByIdQueryHandler<>),
                    typeof(RavenStandardQueries.GetOneQueryHandler<>),
                    typeof(RavenStandardQueries.GetAllQueryHandler<>),
                    typeof(RavenStandardQueries.GetTotalCountQueryHandler<>)
                    );

                IncludeRegistry<RavenContainerRegistry>();

                StandardInteractionHandlerRegistration.RegisterStandardInteractionHandlersForEntities(this, standardInteractionHandlerGenericTypeDefinitions);
                StandardInteractionHandlerRegistration.RegisterStandardNonGenericGetByIdQueryHandler(this, typeof(RavenStandardQueries.GetByIdQueryHandler));

                For<UnitOfWork>()
                    .LifecycleIs(new InteractionScopeLifecycle())
                    .Use(() => UnitOfWorkFactory.CreateUnitOfWork());
            }
            else if (UnitOfWorkFactory.DefaultUnitOfWorkType == typeof(NHibernate.UnitOfWork))
            {
                For<IQueryHandler<GetByIdQuery, Option<object>>>().Singleton().Use<NHibernateStandardQueries.GetByIdQueryHandler>();
                standardInteractionHandlerGenericTypeDefinitions = new StandardInteractionHandlerGenericTypeDefinitions
                (
                    typeof(NHibernateStandardQueries.GetByIdQueryHandler<>),
                    typeof(NHibernateStandardQueries.GetOneQueryHandler<>),
                    typeof(NHibernateStandardQueries.GetAllQueryHandler<>),
                    typeof(NHibernateStandardQueries.GetTotalCountQueryHandler<>)
                );

                IncludeRegistry<NHibernateContainerRegistry>();

                StandardInteractionHandlerRegistration.RegisterStandardInteractionHandlersForEntities(this, standardInteractionHandlerGenericTypeDefinitions);
                StandardInteractionHandlerRegistration.RegisterStandardNonGenericGetByIdQueryHandler(this, typeof(NHibernateStandardQueries.GetByIdQueryHandler));

                For<UnitOfWork>()
                    .LifecycleIs(new InteractionScopeLifecycle())
                    .Use(() => UnitOfWorkFactory.CreateUnitOfWork());
            }
            else if (UnitOfWorkFactory.DefaultUnitOfWorkType == typeof (Pragmatic.EntityFramework.UnitOfWork))
            {
                IncludeRegistry<EntityFramework.ContainerRegistry>();
            }
            else throw new InvalidOperationException(string.Format("The type '{0}' is not supported as the default unit of work.", UnitOfWorkFactory.DefaultUnitOfWorkType));

            For<IQueryResultCache<GetUsersQuery, User[]>>()
                .Use(new InMemoryEquatableQueryResultCache<GetUsersQuery, User[]>());
        }