Browse Source

modify exensions

master
yangxiaodong 7 years ago
parent
commit
de1715b760
1 changed files with 18 additions and 27 deletions
  1. +18
    -27
      src/Cap.Consistency.EntityFrameworkCore/ConsistencyEntityFrameworkBuilderExtensions.cs

+ 18
- 27
src/Cap.Consistency.EntityFrameworkCore/ConsistencyEntityFrameworkBuilderExtensions.cs View File

@@ -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
{
/// <summary>
/// Contains extension methods to <see cref="ConsistencyBuilder"/> for adding entity framework stores.
@@ -18,34 +20,23 @@ namespace Cap.Consistency.EntityFrameworkCore
/// <returns>The <see cref="ConsistencyBuilder"/> instance this method extends.</returns>
public static ConsistencyBuilder AddEntityFrameworkStores<TContext>(this ConsistencyBuilder builder)
where TContext : DbContext {
builder.Services.TryAdd(GetDefaultServices(builder.MessageType, typeof(TContext)));
return builder;
}

/// <summary>
/// Adds an Entity Framework implementation of message stores.
/// </summary>
/// <typeparam name="TContext">The Entity Framework database context to use.</typeparam>
/// <typeparam name="TKey">The type of the primary key used for the users and roles.</typeparam>
/// <param name="builder">The <see cref="ConsistencyBuilder"/> instance this method extends.</param>
/// <returns>The <see cref="ConsistencyBuilder"/> instance this method extends.</returns>
public static ConsistencyBuilder AddEntityFrameworkStores<TContext, TKey>(this ConsistencyBuilder builder)
where TContext : DbContext
where TKey : IEquatable<TKey> {
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;
}
}
}

Loading…
Cancel
Save