yangxiaodong 7年前
コミット
7b9179d03e
9個のファイルの変更90行の追加47行の削除
  1. +2
    -1
      .gitignore
  2. +6
    -0
      Cap.sln
  3. +20
    -0
      src/Cap.Consistency/ConsistencyBuilder.cs
  4. +5
    -2
      src/Cap.Consistency/ServiceCollectionExtensions.cs
  5. +4
    -3
      test/Cap.Consistency.Test/Cap.Consistency.Test.xproj
  6. +0
    -14
      test/Cap.Consistency.Test/Class1.cs
  7. +38
    -2
      test/Cap.Consistency.Test/ConsistencyMessageManagerTest.cs
  8. +0
    -19
      test/Cap.Consistency.Test/Properties/AssemblyInfo.cs
  9. +15
    -6
      test/Cap.Consistency.Test/project.json

+ 2
- 1
.gitignore ファイルの表示

@@ -28,4 +28,5 @@ project.lock.json
.vs
.build/
.testPublish/
/src/Cap.Consistency/obj/Debug/netstandard1.6
obj/
bin/

+ 6
- 0
Cap.sln ファイルの表示

@@ -16,6 +16,11 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Cap.Consistency", "src\Cap.
EndProject
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Cap.Consistency.Test", "test\Cap.Consistency.Test\Cap.Consistency.Test.xproj", "{3A444CF8-1611-407F-8D32-5D0CDC3DD49D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E5A7F49-8E31-4A71-90CC-1DA9AEDA99EE}"
ProjectSection(SolutionItems) = preProject
test\Shared\TestConsistencyMessage.cs = test\Shared\TestConsistencyMessage.cs
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -37,5 +42,6 @@ Global
GlobalSection(NestedProjects) = preSolution
{E8AF8611-0EA4-4B19-BC48-87C57A87DC66} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
{3A444CF8-1611-407F-8D32-5D0CDC3DD49D} = {C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}
{9E5A7F49-8E31-4A71-90CC-1DA9AEDA99EE} = {C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}
EndGlobalSection
EndGlobal

+ 20
- 0
src/Cap.Consistency/ConsistencyBuilder.cs ファイルの表示

@@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;

namespace Cap.Consistency
{
@@ -43,9 +44,28 @@ namespace Cap.Consistency
return AddScoped(typeof(IConsistencyMessageStore<>).MakeGenericType(MessageType), typeof(T));
}

/// <summary>
/// Adds a <see cref="ConsistencyMessageManager{TUser}"/> for the <seealso cref="MessageType"/>.
/// </summary>
/// <typeparam name="TMessageManager">The type of the message manager to add.</typeparam>
/// <returns>The current <see cref="ConsistencyBuilder"/> instance.</returns>
public virtual ConsistencyBuilder AddConsistencyMessageManager<TMessageManager>() where TMessageManager : class {
var messageManagerType = typeof(ConsistencyMessageManager<>).MakeGenericType(MessageType);
var customType = typeof(TMessageManager);
if (messageManagerType == customType ||
!messageManagerType.GetTypeInfo().IsAssignableFrom(customType.GetTypeInfo())) {
throw new InvalidOperationException($"Type {customType.Name} must be derive from ConsistencyMessageManager<{MessageType.Name}>");
}
Services.AddScoped(customType, services => services.GetRequiredService(messageManagerType));
return AddScoped(messageManagerType, customType);
}


private ConsistencyBuilder AddScoped(Type serviceType, Type concreteType) {
Services.AddScoped(serviceType, concreteType);
return this;
}


}
}

+ 5
- 2
src/Cap.Consistency/ServiceCollectionExtensions.cs ファイルの表示

@@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// Contains extension methods to <see cref="IServiceCollection"/> for configuring kafka consistence services.
/// Contains extension methods to <see cref="IServiceCollection"/> for configuring consistence services.
/// </summary>
public static class ServiceCollectionExtensions
{
@@ -14,10 +14,13 @@ namespace Microsoft.Extensions.DependencyInjection
/// </summary>
/// <param name="services">The services available in the application.</param>
/// <returns>An <see cref="IServiceCollection"/> for application services.</returns>
public static ConsistencyBuilder AddKafkaConsistence<TMessage>(this IServiceCollection services)
public static ConsistencyBuilder AddConsistency<TMessage>(this IServiceCollection services)
where TMessage : class {

services.TryAddSingleton<ConsistencyMarkerService>();

services.TryAddScoped<ConsistencyMessageManager<TMessage>, ConsistencyMessageManager<TMessage>>();

return new ConsistencyBuilder(typeof(TMessage), services);
}
}

+ 4
- 3
test/Cap.Consistency.Test/Cap.Consistency.Test.xproj ファイルの表示

@@ -4,7 +4,6 @@
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>

<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
<PropertyGroup Label="Globals">
<ProjectGuid>3a444cf8-1611-407f-8d32-5d0cdc3dd49d</ProjectGuid>
@@ -13,9 +12,11 @@
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
</PropertyGroup>

<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
</PropertyGroup>
<ItemGroup>
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
</ItemGroup>
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>
</Project>

+ 0
- 14
test/Cap.Consistency.Test/Class1.cs ファイルの表示

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Cap.Consistency.Test
{
public class Class1
{
public Class1()
{
}
}
}

+ 38
- 2
test/Cap.Consistency.Test/ConsistencyMessageManagerTest.cs ファイルの表示

@@ -1,9 +1,12 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
using Microsoft.Extensions.Logging;
using Moq;

namespace Cap.Consistency.Test
{
@@ -11,7 +14,40 @@ namespace Cap.Consistency.Test
{
[Fact]
public void EnsureDefaultServicesDefaultsWithStoreWorks() {
var services = new ServiceCollection().AddTransient<IConsistencyMessageStore<TestConsistencyMessage>, NoopMessageStore>();
var services = new ServiceCollection()
.AddTransient<IConsistencyMessageStore<TestConsistencyMessage>, NoopMessageStore>();
services.AddConsistency<TestConsistencyMessage>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddLogging();

var manager = services.BuildServiceProvider()
.GetRequiredService<ConsistencyMessageManager<TestConsistencyMessage>>();

Assert.NotNull(manager);
}

[Fact]
public void AddMessageManagerWithCustomerMannagerReturnsSameInstance() {
var services = new ServiceCollection()
.AddTransient<IConsistencyMessageStore<TestConsistencyMessage>, NoopMessageStore>()
.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

services.AddLogging();

services.AddConsistency<TestConsistencyMessage>()
.AddConsistencyMessageManager<CustomMessageManager>();

var provider = services.BuildServiceProvider();

Assert.Same(provider.GetRequiredService<ConsistencyMessageManager<TestConsistencyMessage>>(),
provider.GetRequiredService<CustomMessageManager>());
}

public class CustomMessageManager : ConsistencyMessageManager<TestConsistencyMessage>
{
public CustomMessageManager()
: base(new Mock<IConsistencyMessageStore<TestConsistencyMessage>>().Object, null, null) {
}
}
}
}

+ 0
- 19
test/Cap.Consistency.Test/Properties/AssemblyInfo.cs ファイルの表示

@@ -1,19 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Cap.Consistency.Test")]
[assembly: AssemblyTrademark("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3a444cf8-1611-407f-8d32-5d0cdc3dd49d")]

+ 15
- 6
test/Cap.Consistency.Test/project.json ファイルの表示

@@ -1,10 +1,20 @@
{
{
"version": "1.0.0-*",

"buildOptions": {
"warningsAsErrors": true,
"compile": {
"include": "../Shared/TestConsistencyMessage.cs"
}
},
"dependencies": {
"xunit": "2.2.0-beta4-build3444",
"dotnet-test-xunit": "2.2.0-preview2-build1029",
"Cap.Consistency": "1.0.0-*"
"xunit": "2.2.0-*",
"Microsoft.AspNetCore.Http": "1.1.0-*",
"Microsoft.Extensions.DependencyInjection": "1.1.0-*",
"dotnet-test-xunit": "2.2.0-*",
"Cap.Consistency": "1.0.0-*",
"Moq": "4.6.36-*",
"Microsoft.Extensions.Logging": "1.1.0-*"
},

"frameworks": {
@@ -14,8 +24,7 @@
"Microsoft.NETCore.App": {
"version": "1.1.0",
"type": "platform"
},
//"moq.netcore": "4.4.0-beta8"
}
}
}
},


読み込み中…
キャンセル
保存