/// <inheritdoc/> public virtual IRepository CreateRepository(Type entityType, Type keyType, ApplicationModelType modelType) { if (entityType == null) { throw new ArgumentNullException(nameof(entityType)); } if (keyType == null) { throw new ArgumentNullException(nameof(keyType)); } var pluginName = modelType switch { ApplicationModelType.WriteModel => this.Options.Persistence.DefaultWriteModelRepository?.PluginName, ApplicationModelType.ReadModel => this.Options.Persistence.DefaultReadModelRepository?.PluginName, _ => throw new NotSupportedException($"The specified {nameof(ApplicationModelType)} '{modelType}' is not supported") }; if (this.Options.Persistence.Repositories.TryGetValue(entityType.FullName !, out var repositoryOptions)) { pluginName = repositoryOptions.PluginName; } if (string.IsNullOrWhiteSpace(pluginName) || !this.PluginManager.TryGetPlugin <IRepositoryPlugin>(pluginName, out var factory)) { return((IRepository)ActivatorUtilities.CreateInstance(this.ServiceProvider, typeof(DistributedCacheRepository <,>).MakeGenericType(entityType, keyType))); } return(factory.CreateRepository(entityType, keyType)); } }
internal static IServiceCollection AddRepositories(this IServiceCollection services, IEnumerable <Type> entityTypes, ServiceLifetime lifetime, ApplicationModelType modelType) { foreach (Type entityType in entityTypes) { services.AddRepository(entityType, lifetime, modelType); } return(services); }
/// <summary> /// Creates a new <see cref="IRepository"/> /// </summary> /// <param name="factory">The extended <see cref="IRepositoryFactory"/></param> /// <param name="entityType">The type of entity to create the <see cref="IRepository"/> for</param> /// <param name="modelType">The type of the application model to create a new <see cref="IRepository"/> for</param> /// <returns>A new <see cref="IRepository"/></returns> public static IRepository CreateRepository(this IRepositoryFactory factory, Type entityType, ApplicationModelType modelType) { if (entityType == null) { throw new ArgumentNullException(nameof(entityType)); } var keyType = entityType.GetGenericType(typeof(IIdentifiable <>)).GetGenericArguments()[0]; return(factory.CreateRepository(entityType, keyType, modelType)); }
static IServiceCollection AddRepository(this IServiceCollection services, Type entityType, ServiceLifetime lifetime, ApplicationModelType modelType) { var keyType = entityType.GetGenericType(typeof(IIdentifiable <>)).GetGenericArguments()[0]; var genericRepositoryType = typeof(IRepository <,>).MakeGenericType(entityType, keyType); services.Add(new(genericRepositoryType, provider => provider.GetRequiredService <IRepositoryFactory>().CreateRepository(entityType, modelType), lifetime)); services.Add(new(typeof(IRepository <>).MakeGenericType(entityType), provider => provider.GetRequiredService(genericRepositoryType), lifetime)); return(services); }