Skip to content

Commit

Permalink
Avoid unnecessary service instantiation during host
Browse files Browse the repository at this point in the history
For non-singleton service, it will instantiate a service object during host, which is not expected.
  • Loading branch information
scott-xu committed Mar 1, 2023
1 parent 80ef21b commit 4594355
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 25 deletions.
16 changes: 13 additions & 3 deletions src/Ninject.Extensions.Wcf/BaseNinjectServiceHostFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,19 @@ public static void SetKernel(IKernel kernel)
/// </returns>
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return (ServiceHost)kernelInstance.Get(
this.ServiceHostType.MakeGenericType(serviceType),
new ConstructorArgument("baseAddresses", baseAddresses));
if (ServiceTypeHelper.IsSingletonService(serviceType))
{
return (ServiceHost)kernelInstance.Get(
this.ServiceHostType.MakeGenericType(serviceType),
new ConstructorArgument("instance", kernelInstance.Get(serviceType)),
new ConstructorArgument("baseAddresses", baseAddresses));
}
else
{
return (ServiceHost)kernelInstance.Get(
this.ServiceHostType.MakeGenericType(serviceType),
new ConstructorArgument("baseAddresses", baseAddresses));
}
}
}
}
16 changes: 13 additions & 3 deletions src/Ninject.Extensions.Wcf/BaseNinjectServiceSelfHostFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,19 @@ public static void SetKernel(IKernel kernel)
/// </returns>
public ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return (ServiceHost)kernelInstance.Get(
this.ServiceHostType.MakeGenericType(serviceType),
new ConstructorArgument("baseAddresses", baseAddresses));
if (ServiceTypeHelper.IsSingletonService(serviceType))
{
return (ServiceHost)kernelInstance.Get(
this.ServiceHostType.MakeGenericType(serviceType),
new ConstructorArgument("instance", kernelInstance.Get(serviceType)),
new ConstructorArgument("baseAddresses", baseAddresses));
}
else
{
return (ServiceHost)kernelInstance.Get(
this.ServiceHostType.MakeGenericType(serviceType),
new ConstructorArgument("baseAddresses", baseAddresses));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,20 @@ protected NinjectAbstractServiceHost(IServiceBehavior serviceBehavior, T instanc
{
var addresses = new UriSchemeKeyedCollection(baseAddresses);

if (ServiceTypeHelper.IsSingletonService(instance))
{
this.InitializeDescription(instance, addresses);
}
else
{
this.InitializeDescription(typeof(T), addresses);
}
this.InitializeDescription(instance, addresses);
}

/// <summary>
/// Initializes a new instance of the <see cref="NinjectAbstractServiceHost{T}"/> class.
/// </summary>
/// <param name="serviceBehavior">The service behavior.</param>
/// <param name="baseAddresses">The baseAddresses.</param>
protected NinjectAbstractServiceHost(IServiceBehavior serviceBehavior, Uri[] baseAddresses)
: base(serviceBehavior)
{
var addresses = new UriSchemeKeyedCollection(baseAddresses);

this.InitializeDescription(typeof(T), addresses);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,15 @@ public NinjectIISHostingServiceHost(IServiceBehavior serviceBehavior, T instance
: base(serviceBehavior, instance, baseAddresses)
{
}

/// <summary>
/// Initializes a new instance of the <see cref="NinjectIISHostingServiceHost{T}"/> class.
/// </summary>
/// <param name="serviceBehavior">The service behavior.</param>
/// <param name="baseAddresses">The base addresses.</param>
public NinjectIISHostingServiceHost(IServiceBehavior serviceBehavior, Uri[] baseAddresses)
: base(serviceBehavior, baseAddresses)
{
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,14 @@ public NinjectServiceHost(IServiceBehavior serviceBehavior, T instance)
: base(serviceBehavior, instance, new Uri[0])
{
}

/// <summary>
/// Initializes a new instance of the <see cref="NinjectServiceHost{T}"/> class.
/// </summary>
/// <param name="serviceBehavior">The service behavior.</param>
public NinjectServiceHost(IServiceBehavior serviceBehavior)
: base(serviceBehavior, new Uri[0])
{
}
}
}
7 changes: 4 additions & 3 deletions src/Ninject.Extensions.Wcf/ServiceTypeHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

namespace Ninject.Extensions.Wcf
{
using System;
using System.Linq;
using System.ServiceModel;

Expand All @@ -31,14 +32,14 @@ internal static class ServiceTypeHelper
/// <summary>
/// Determines whether the given service is a singleton service.
/// </summary>
/// <param name="service">The service.</param>
/// <param name="serviceType">The service type.</param>
/// <returns>
/// <c>true</c> if the service is a singleton; otherwise, <c>false</c>.
/// </returns>
public static bool IsSingletonService(object service)
public static bool IsSingletonService(Type serviceType)
{
var serviceBehaviorAttribute =
service.GetType().GetCustomAttributes(typeof(ServiceBehaviorAttribute), true)
serviceType.GetCustomAttributes(typeof(ServiceBehaviorAttribute), true)
.Cast<ServiceBehaviorAttribute>()
.SingleOrDefault();
return serviceBehaviorAttribute != null && serviceBehaviorAttribute.InstanceContextMode == InstanceContextMode.Single;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,20 @@ protected NinjectAbstractWebServiceHost(IServiceBehavior serviceBehavior, T inst
{
var addresses = new UriSchemeKeyedCollection(baseBaseAddresses);

if (ServiceTypeHelper.IsSingletonService(instance))
{
this.InitializeDescription(instance, addresses);
}
else
{
this.InitializeDescription(typeof(T), addresses);
}
this.InitializeDescription(instance, addresses);
}

/// <summary>
/// Initializes a new instance of the <see cref="NinjectAbstractWebServiceHost{T}"/> class.
/// </summary>
/// <param name="serviceBehavior">The service behavior.</param>
/// <param name="baseBaseAddresses">The base addresses.</param>
protected NinjectAbstractWebServiceHost(IServiceBehavior serviceBehavior, Uri[] baseBaseAddresses)
: base(serviceBehavior)
{
var addresses = new UriSchemeKeyedCollection(baseBaseAddresses);

this.InitializeDescription(typeof(T), addresses);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,15 @@ public NinjectIISHostingWebServiceHost(IServiceBehavior serviceBehavior, T insta
: base(serviceBehavior, instance, baseAddresses)
{
}

/// <summary>
/// Initializes a new instance of the <see cref="NinjectIISHostingWebServiceHost{T}"/> class.
/// </summary>
/// <param name="serviceBehavior">The service behavior.</param>
/// <param name="baseAddresses">The base addresses.</param>
public NinjectIISHostingWebServiceHost(IServiceBehavior serviceBehavior, Uri[] baseAddresses)
: base(serviceBehavior, baseAddresses)
{
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,14 @@ public NinjectWebServiceHost(IServiceBehavior serviceBehavior, T instance)
: base(serviceBehavior, instance, new Uri[0])
{
}

/// <summary>
/// Initializes a new instance of the <see cref="NinjectWebServiceHost{T}"/> class.
/// </summary>
/// <param name="serviceBehavior">The service behavior.</param>
public NinjectWebServiceHost(IServiceBehavior serviceBehavior)
: base(serviceBehavior, new Uri[0])
{
}
}
}

0 comments on commit 4594355

Please sign in to comment.