From de1715b760ce03098a55adedef7c3a60994c8c3c Mon Sep 17 00:00:00 2001 From: yangxiaodong Date: Mon, 29 May 2017 18:45:51 +0800 Subject: [PATCH] modify exensions --- ...istencyEntityFrameworkBuilderExtensions.cs | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/src/Cap.Consistency.EntityFrameworkCore/ConsistencyEntityFrameworkBuilderExtensions.cs b/src/Cap.Consistency.EntityFrameworkCore/ConsistencyEntityFrameworkBuilderExtensions.cs index df1ef69..d2cfc2d 100644 --- a/src/Cap.Consistency.EntityFrameworkCore/ConsistencyEntityFrameworkBuilderExtensions.cs +++ b/src/Cap.Consistency.EntityFrameworkCore/ConsistencyEntityFrameworkBuilderExtensions.cs @@ -1,9 +1,11 @@ using System; +using System.Reflection; +using Cap.Consistency; +using Cap.Consistency.EntityFrameworkCore; +using Cap.Consistency.Infrastructure; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -namespace Cap.Consistency.EntityFrameworkCore +namespace Microsoft.Extensions.DependencyInjection { /// /// Contains extension methods to for adding entity framework stores. @@ -18,34 +20,23 @@ namespace Cap.Consistency.EntityFrameworkCore /// The instance this method extends. public static ConsistencyBuilder AddEntityFrameworkStores(this ConsistencyBuilder builder) where TContext : DbContext { - builder.Services.TryAdd(GetDefaultServices(builder.MessageType, typeof(TContext))); - return builder; - } - /// - /// Adds an Entity Framework implementation of message stores. - /// - /// The Entity Framework database context to use. - /// The type of the primary key used for the users and roles. - /// The instance this method extends. - /// The instance this method extends. - public static ConsistencyBuilder AddEntityFrameworkStores(this ConsistencyBuilder builder) - where TContext : DbContext - where TKey : IEquatable { - builder.Services.TryAdd(GetDefaultServices(builder.MessageType, typeof(TContext), typeof(TKey))); + builder.Services.AddScoped(typeof(IConsistencyMessageStore<>).MakeGenericType(builder.MessageType), + typeof(ConsistencyMessageStore<,>).MakeGenericType(typeof(ConsistencyMessage), typeof(TContext))); + return builder; } - private static IServiceCollection GetDefaultServices(Type messageType, Type contextType, Type keyType = null) { - Type messageStoreType; - keyType = keyType ?? typeof(string); - messageStoreType = typeof(IConsistencyMessageStore<>).MakeGenericType(messageType, contextType, keyType); - - var services = new ServiceCollection(); - services.AddScoped( - typeof(IConsistencyMessageStore<>).MakeGenericType(messageStoreType), - messageStoreType); - return services; + private static TypeInfo FindGenericBaseType(Type currentType, Type genericBaseType) { + var type = currentType.GetTypeInfo(); + while (type.BaseType != null) { + type = type.BaseType.GetTypeInfo(); + var genericType = type.IsGenericType ? type.GetGenericTypeDefinition() : null; + if (genericType != null && genericType == genericBaseType) { + return type; + } + } + return null; } } } \ No newline at end of file