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); } }
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>(); }
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[]>()); }