Skip to content

Commit

Permalink
added dotnet core support and refactor code
Browse files Browse the repository at this point in the history
  • Loading branch information
ShiningRush committed Jan 25, 2018
1 parent 480478d commit d4fae7a
Show file tree
Hide file tree
Showing 11 changed files with 324 additions and 41 deletions.
14 changes: 14 additions & 0 deletions ServiceAnt.sln
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{4FE1FF00-52E
src\Directory.Build.props = src\Directory.Build.props
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceAnt.IocInstaller.DotNetCore", "src\ServiceAnt.IocInstaller.DotNetCore\ServiceAnt.IocInstaller.DotNetCore.csproj", "{47B742B7-62A5-45EC-99F2-1700F60D138E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceAnt.IocInstaller.DotNetCore.Test", "test\ServiceAnt.IocInstaller.DotNetCore.Test\ServiceAnt.IocInstaller.DotNetCore.Test.csproj", "{2A67FC30-B4C3-4945-BFF7-E25A5C496ADE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -56,6 +60,14 @@ Global
{ABC9A287-31CC-422B-84A2-6EAEF0BD448E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ABC9A287-31CC-422B-84A2-6EAEF0BD448E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ABC9A287-31CC-422B-84A2-6EAEF0BD448E}.Release|Any CPU.Build.0 = Release|Any CPU
{47B742B7-62A5-45EC-99F2-1700F60D138E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47B742B7-62A5-45EC-99F2-1700F60D138E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47B742B7-62A5-45EC-99F2-1700F60D138E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47B742B7-62A5-45EC-99F2-1700F60D138E}.Release|Any CPU.Build.0 = Release|Any CPU
{2A67FC30-B4C3-4945-BFF7-E25A5C496ADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A67FC30-B4C3-4945-BFF7-E25A5C496ADE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A67FC30-B4C3-4945-BFF7-E25A5C496ADE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A67FC30-B4C3-4945-BFF7-E25A5C496ADE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -68,6 +80,8 @@ Global
{1FA5221C-9A54-4132-B7CF-CF7CC7A30E59} = {0E041832-D5A5-4220-BD7D-95B03E66FF98}
{ABC9A287-31CC-422B-84A2-6EAEF0BD448E} = {BDFDFA2C-DA6F-4405-B7B0-31D1B0997150}
{4FE1FF00-52E7-4311-A21F-7C34831E62F1} = {5220EBDE-1FFD-4155-85A9-9A87DF0C073C}
{47B742B7-62A5-45EC-99F2-1700F60D138E} = {0E041832-D5A5-4220-BD7D-95B03E66FF98}
{2A67FC30-B4C3-4945-BFF7-E25A5C496ADE} = {BDFDFA2C-DA6F-4405-B7B0-31D1B0997150}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {52E5EADF-2B54-4C50-BF32-93550974966D}
Expand Down
52 changes: 27 additions & 25 deletions src/ServiceAnt.IocInstaller.Autofac/ServiceAntModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,42 +28,44 @@ public ServiceAntModule(params System.Reflection.Assembly[] handlerAssemblies)
_handlerAssemblies = handlerAssemblies;
}

/// <summary>
/// Excute this method ater you builded container
/// </summary>
/// <param name="container"></param>
public static void RegisterHandlers(IComponentContext container)
{
foreach (var aHandlerAssembly in _handlerAssemblies)
{
var handlerTypes = aHandlerAssembly.GetTypes().Where(p => typeof(IHandler).IsAssignableFrom(p) && !p.IsInterface);

foreach (var aHandler in handlerTypes)
{
RegisterHandlerType(container, aHandler);
}
}
}

/// <summary>
/// Intall dependenies and register handler function
/// </summary>
/// <param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
var serviceBus = InProcessServiceBus.Default;
builder.RegisterInstance(serviceBus).As<IServiceBus>();
builder.RegisterType<InMemorySubscriptionsManager>().AsSelf().As<ISubscriptionManager>().SingleInstance();
builder.RegisterType<InMemoryRequestHandlerManager>().AsSelf().As<IRequestHandlerManager>().SingleInstance();
var subcriptionsManager = new InMemorySubscriptionsManager();
var requestManager = new InMemoryRequestHandlerManager();

RegisterHandlers(subcriptionsManager, requestManager);
builder.RegisterInstance(subcriptionsManager).As<ISubscriptionManager>().SingleInstance();
builder.RegisterInstance(requestManager).As<IRequestHandlerManager>().SingleInstance();

builder.Register<IocResolver>(ctx =>
builder.Register<IIocResolver>(ctx =>
{
return new IocResolver(ctx.Resolve<IComponentContext>());
});

builder.RegisterType<InProcessServiceBus>().AsSelf().As<IServiceBus>().SingleInstance();

builder.RegisterAssemblyTypes(_handlerAssemblies).AsSelf();

}

private void RegisterHandlers(ISubscriptionManager subcriptionsManager, IRequestHandlerManager requestManager )
{
foreach (var aHandlerAssembly in _handlerAssemblies)
{
var handlerTypes = aHandlerAssembly.GetTypes().Where(p => typeof(IHandler).IsAssignableFrom(p) && !p.IsInterface);

foreach (var aHandler in handlerTypes)
{
RegisterHandlerType(subcriptionsManager, requestManager, aHandler);
}
}
}
private static void RegisterHandlerType(IComponentContext container, Type aHandlerType)

private void RegisterHandlerType(ISubscriptionManager subcriptionsManager, IRequestHandlerManager requestManager , Type aHandlerType)
{
var interfaces = aHandlerType.GetInterfaces();
foreach (var aInterface in interfaces)
Expand All @@ -77,9 +79,9 @@ private static void RegisterHandlerType(IComponentContext container, Type aHandl
if (genericArgs.Length == 1)
{
if (typeof(IRequestHandler).IsAssignableFrom(aInterface))
container.Resolve<IServiceBus>().AddRequestHandler(genericArgs[0], new IocHandlerFactory(container.Resolve<IocResolver>(), aHandlerType, genericArgs[0]));
requestManager.AddRequestHandler(genericArgs[0], new IocHandlerFactory( aHandlerType, genericArgs[0]));
else
container.Resolve<IServiceBus>().AddSubscription(genericArgs[0], new IocHandlerFactory(container.Resolve<IocResolver>(), aHandlerType, genericArgs[0]));
subcriptionsManager.AddSubscription(genericArgs[0], new IocHandlerFactory( aHandlerType, genericArgs[0]));
}
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/ServiceAnt.IocInstaller.Castle/ServiceAntInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
using ServiceAnt.Handler.Request;
using ServiceAnt.Infrastructure.Dependency;
using ServiceAnt.Request.Handler;
using ServiceAnt.Subscription;
using System;
Expand Down Expand Up @@ -42,7 +43,8 @@ public void Install(IWindsorContainer container, IConfigurationStore store)
_container = container;

container.Register(
Component.For<IServiceBus>().Instance(InProcessServiceBus.Default),
Component.For<IIocResolver>().UsingFactoryMethod(ctx => new IocResolver(container)).LifestyleTransient(),
Component.For<IServiceBus>().ImplementedBy<InProcessServiceBus>().LifestyleSingleton(),
Component.For<ISubscriptionManager>().ImplementedBy<InMemorySubscriptionsManager>().LifestyleSingleton(),
Component.For<IRequestHandlerManager>().ImplementedBy<InMemoryRequestHandlerManager>().LifestyleSingleton());

Expand Down Expand Up @@ -75,15 +77,13 @@ private void Kernel_ComponentRegistered(string key, IHandler handler)
continue;
}

var resolver = new IocResolver(_container);

var genericArgs = aInterface.GetGenericArguments();
if (genericArgs.Length == 1)
{
if (typeof(IRequestHandler).GetTypeInfo().IsAssignableFrom(aInterface))
_serviceBus.AddRequestHandler(genericArgs[0], new Base.IocHandlerFactory(resolver, handler.ComponentModel.Implementation, genericArgs[0]));
_serviceBus.AddRequestHandler(genericArgs[0], new Base.IocHandlerFactory(handler.ComponentModel.Implementation, genericArgs[0]));
else
_serviceBus.AddSubscription(genericArgs[0], new Base.IocHandlerFactory(resolver, handler.ComponentModel.Implementation, genericArgs[0]));
_serviceBus.AddSubscription(genericArgs[0], new Base.IocHandlerFactory(handler.ComponentModel.Implementation, genericArgs[0]));
}
}
}
Expand Down
46 changes: 46 additions & 0 deletions src/ServiceAnt.IocInstaller.DotNetCore/IocResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using ServiceAnt.Infrastructure.Dependency;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServiceAnt.IocInstaller.DotNetCore
{
/// <summary>
/// IocResolver
/// </summary>
public class IocResolver : IIocResolver
{
private readonly IServiceProvider _container;

/// <summary>
/// Constructor
/// </summary>
/// <param name="container">the container of castle</param>
public IocResolver(IServiceProvider container)
{
_container = container;
}

/// <summary>
/// Releases a pre-resolved object. See Resolve methods.
/// </summary>
/// <param name="obj">Object to be released</param>
public void Release(object obj)
{
}

/// <summary>
/// Gets an object from IOC container.
/// Returning object must be Released (see <see cref="Release"/>) after usage.
/// </summary>
/// <typeparam name="T">Type of the object to cast</typeparam>
/// <param name="type">Type of the object to resolve</param>
/// <returns>The object instance</returns>
public T Resolve<T>(Type type)
{
return (T)_container.GetService(type);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>The IOC installer of ServiceAnt for dotnet core</Description>
<PackageTags>$(PackageTags)</PackageTags>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\ServiceAnt\ServiceAnt.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.0.0" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using Microsoft.Extensions.DependencyInjection;
using ServiceAnt.Handler.Request;
using ServiceAnt.Subscription;
using System;
using System.Reflection;
using System.Linq;
using ServiceAnt.Base;
using ServiceAnt.Request.Handler;
using ServiceAnt.Infrastructure.Dependency;
using ServiceAnt.IocInstaller.DotNetCore;
using ServiceAnt;

namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionExtensions
{
private static System.Reflection.Assembly[] _handlerAssemblies;

public static void AddServiceAnt(this IServiceCollection @this, params Assembly[] handlerAssemblies)
{
_handlerAssemblies = handlerAssemblies;

var subcriptionsManager = new InMemorySubscriptionsManager();
var requestManager = new InMemoryRequestHandlerManager();

RegisterHandlers(subcriptionsManager, requestManager);
@this.AddSingleton<ISubscriptionManager>(subcriptionsManager);
@this.AddSingleton<IRequestHandlerManager>(requestManager);

@this.AddTransient<IIocResolver>(serviceProvider =>
{
return new IocResolver(serviceProvider);
});
@this.AddSingleton<IServiceBus, InProcessServiceBus>();


var allHandlerTypes = _handlerAssemblies.SelectMany(p => p.ExportedTypes).Where(p=>typeof(IHandler).IsAssignableFrom(p));
foreach (var aHandlerType in allHandlerTypes)
{
@this.AddTransient(aHandlerType);
}
}

private static void RegisterHandlers(ISubscriptionManager subcriptionsManager, IRequestHandlerManager requestManager)
{
foreach (var aHandlerAssembly in _handlerAssemblies)
{
var handlerTypes = aHandlerAssembly.GetTypes().Where(p => typeof(IHandler).IsAssignableFrom(p) && !p.IsInterface);

foreach (var aHandler in handlerTypes)
{
RegisterHandlerType(subcriptionsManager, requestManager, aHandler);
}
}
}

private static void RegisterHandlerType(ISubscriptionManager subcriptionsManager, IRequestHandlerManager requestManager, Type aHandlerType)
{
var interfaces = aHandlerType.GetInterfaces();
foreach (var aInterface in interfaces)
{
if (!typeof(IHandler).IsAssignableFrom(aInterface))
{
continue;
}

var genericArgs = aInterface.GetGenericArguments();
if (genericArgs.Length == 1)
{
if (typeof(IRequestHandler).IsAssignableFrom(aInterface))
requestManager.AddRequestHandler(genericArgs[0], new IocHandlerFactory(aHandlerType, genericArgs[0]));
else
subcriptionsManager.AddSubscription(genericArgs[0], new IocHandlerFactory(aHandlerType, genericArgs[0]));
}
}
}
}
}
13 changes: 10 additions & 3 deletions src/ServiceAnt/Base/IocHandlerFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,23 @@ public class IocHandlerFactory : IHandlerFactory
/// <summary>
/// ctor
/// </summary>
/// <param name="iocResolver"></param>
/// <param name="handlerType"></param>
/// <param name="localEventType"></param>
public IocHandlerFactory(IIocResolver iocResolver, Type handlerType, Type localEventType)
public IocHandlerFactory(Type handlerType, Type localEventType)
{
_iocResolver = iocResolver;
_handlerType = handlerType;
_localEventType = localEventType;
}

/// <summary>
/// set the IocResolver to resolve service
/// </summary>
/// <param name="iocResolver"></param>
public void SetIocResolver(IIocResolver iocResolver)
{
_iocResolver = iocResolver;
}

/// <summary>
/// get handler
/// </summary>
Expand Down

0 comments on commit d4fae7a

Please sign in to comment.