Skip to content

Commit 4594355

Browse files
committed
Avoid unnecessary service instantiation during host
For non-singleton service, it will instantiate a service object during host, which is not expected.
1 parent 80ef21b commit 4594355

9 files changed

+96
-25
lines changed

src/Ninject.Extensions.Wcf/BaseNinjectServiceHostFactory.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,19 @@ public static void SetKernel(IKernel kernel)
6868
/// </returns>
6969
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
7070
{
71-
return (ServiceHost)kernelInstance.Get(
72-
this.ServiceHostType.MakeGenericType(serviceType),
73-
new ConstructorArgument("baseAddresses", baseAddresses));
71+
if (ServiceTypeHelper.IsSingletonService(serviceType))
72+
{
73+
return (ServiceHost)kernelInstance.Get(
74+
this.ServiceHostType.MakeGenericType(serviceType),
75+
new ConstructorArgument("instance", kernelInstance.Get(serviceType)),
76+
new ConstructorArgument("baseAddresses", baseAddresses));
77+
}
78+
else
79+
{
80+
return (ServiceHost)kernelInstance.Get(
81+
this.ServiceHostType.MakeGenericType(serviceType),
82+
new ConstructorArgument("baseAddresses", baseAddresses));
83+
}
7484
}
7585
}
7686
}

src/Ninject.Extensions.Wcf/BaseNinjectServiceSelfHostFactory.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,19 @@ public static void SetKernel(IKernel kernel)
6767
/// </returns>
6868
public ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
6969
{
70-
return (ServiceHost)kernelInstance.Get(
71-
this.ServiceHostType.MakeGenericType(serviceType),
72-
new ConstructorArgument("baseAddresses", baseAddresses));
70+
if (ServiceTypeHelper.IsSingletonService(serviceType))
71+
{
72+
return (ServiceHost)kernelInstance.Get(
73+
this.ServiceHostType.MakeGenericType(serviceType),
74+
new ConstructorArgument("instance", kernelInstance.Get(serviceType)),
75+
new ConstructorArgument("baseAddresses", baseAddresses));
76+
}
77+
else
78+
{
79+
return (ServiceHost)kernelInstance.Get(
80+
this.ServiceHostType.MakeGenericType(serviceType),
81+
new ConstructorArgument("baseAddresses", baseAddresses));
82+
}
7383
}
7484
}
7585
}

src/Ninject.Extensions.Wcf/ServiceHost/NinjectAbstractServiceHost.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,20 @@ protected NinjectAbstractServiceHost(IServiceBehavior serviceBehavior, T instanc
4242
{
4343
var addresses = new UriSchemeKeyedCollection(baseAddresses);
4444

45-
if (ServiceTypeHelper.IsSingletonService(instance))
46-
{
47-
this.InitializeDescription(instance, addresses);
48-
}
49-
else
50-
{
51-
this.InitializeDescription(typeof(T), addresses);
52-
}
45+
this.InitializeDescription(instance, addresses);
46+
}
47+
48+
/// <summary>
49+
/// Initializes a new instance of the <see cref="NinjectAbstractServiceHost{T}"/> class.
50+
/// </summary>
51+
/// <param name="serviceBehavior">The service behavior.</param>
52+
/// <param name="baseAddresses">The baseAddresses.</param>
53+
protected NinjectAbstractServiceHost(IServiceBehavior serviceBehavior, Uri[] baseAddresses)
54+
: base(serviceBehavior)
55+
{
56+
var addresses = new UriSchemeKeyedCollection(baseAddresses);
57+
58+
this.InitializeDescription(typeof(T), addresses);
5359
}
5460
}
5561
}

src/Ninject.Extensions.Wcf/ServiceHost/NinjectIISHostingServiceHost.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,15 @@ public NinjectIISHostingServiceHost(IServiceBehavior serviceBehavior, T instance
3939
: base(serviceBehavior, instance, baseAddresses)
4040
{
4141
}
42+
43+
/// <summary>
44+
/// Initializes a new instance of the <see cref="NinjectIISHostingServiceHost{T}"/> class.
45+
/// </summary>
46+
/// <param name="serviceBehavior">The service behavior.</param>
47+
/// <param name="baseAddresses">The base addresses.</param>
48+
public NinjectIISHostingServiceHost(IServiceBehavior serviceBehavior, Uri[] baseAddresses)
49+
: base(serviceBehavior, baseAddresses)
50+
{
51+
}
4252
}
4353
}

src/Ninject.Extensions.Wcf/ServiceHost/NinjectServiceHost{T}.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,14 @@ public NinjectServiceHost(IServiceBehavior serviceBehavior, T instance)
3838
: base(serviceBehavior, instance, new Uri[0])
3939
{
4040
}
41+
42+
/// <summary>
43+
/// Initializes a new instance of the <see cref="NinjectServiceHost{T}"/> class.
44+
/// </summary>
45+
/// <param name="serviceBehavior">The service behavior.</param>
46+
public NinjectServiceHost(IServiceBehavior serviceBehavior)
47+
: base(serviceBehavior, new Uri[0])
48+
{
49+
}
4150
}
4251
}

src/Ninject.Extensions.Wcf/ServiceTypeHelper.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
namespace Ninject.Extensions.Wcf
2222
{
23+
using System;
2324
using System.Linq;
2425
using System.ServiceModel;
2526

@@ -31,14 +32,14 @@ internal static class ServiceTypeHelper
3132
/// <summary>
3233
/// Determines whether the given service is a singleton service.
3334
/// </summary>
34-
/// <param name="service">The service.</param>
35+
/// <param name="serviceType">The service type.</param>
3536
/// <returns>
3637
/// <c>true</c> if the service is a singleton; otherwise, <c>false</c>.
3738
/// </returns>
38-
public static bool IsSingletonService(object service)
39+
public static bool IsSingletonService(Type serviceType)
3940
{
4041
var serviceBehaviorAttribute =
41-
service.GetType().GetCustomAttributes(typeof(ServiceBehaviorAttribute), true)
42+
serviceType.GetCustomAttributes(typeof(ServiceBehaviorAttribute), true)
4243
.Cast<ServiceBehaviorAttribute>()
4344
.SingleOrDefault();
4445
return serviceBehaviorAttribute != null && serviceBehaviorAttribute.InstanceContextMode == InstanceContextMode.Single;

src/Ninject.Extensions.Wcf/WebServiceHost/NinjectAbstractWebServiceHost.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,20 @@ protected NinjectAbstractWebServiceHost(IServiceBehavior serviceBehavior, T inst
4242
{
4343
var addresses = new UriSchemeKeyedCollection(baseBaseAddresses);
4444

45-
if (ServiceTypeHelper.IsSingletonService(instance))
46-
{
47-
this.InitializeDescription(instance, addresses);
48-
}
49-
else
50-
{
51-
this.InitializeDescription(typeof(T), addresses);
52-
}
45+
this.InitializeDescription(instance, addresses);
46+
}
47+
48+
/// <summary>
49+
/// Initializes a new instance of the <see cref="NinjectAbstractWebServiceHost{T}"/> class.
50+
/// </summary>
51+
/// <param name="serviceBehavior">The service behavior.</param>
52+
/// <param name="baseBaseAddresses">The base addresses.</param>
53+
protected NinjectAbstractWebServiceHost(IServiceBehavior serviceBehavior, Uri[] baseBaseAddresses)
54+
: base(serviceBehavior)
55+
{
56+
var addresses = new UriSchemeKeyedCollection(baseBaseAddresses);
57+
58+
this.InitializeDescription(typeof(T), addresses);
5359
}
5460
}
5561
}

src/Ninject.Extensions.Wcf/WebServiceHost/NinjectIISHostingWebServiceHost.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,15 @@ public NinjectIISHostingWebServiceHost(IServiceBehavior serviceBehavior, T insta
3939
: base(serviceBehavior, instance, baseAddresses)
4040
{
4141
}
42+
43+
/// <summary>
44+
/// Initializes a new instance of the <see cref="NinjectIISHostingWebServiceHost{T}"/> class.
45+
/// </summary>
46+
/// <param name="serviceBehavior">The service behavior.</param>
47+
/// <param name="baseAddresses">The base addresses.</param>
48+
public NinjectIISHostingWebServiceHost(IServiceBehavior serviceBehavior, Uri[] baseAddresses)
49+
: base(serviceBehavior, baseAddresses)
50+
{
51+
}
4252
}
4353
}

src/Ninject.Extensions.Wcf/WebServiceHost/NinjectWebServiceHost{T}.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,14 @@ public NinjectWebServiceHost(IServiceBehavior serviceBehavior, T instance)
3838
: base(serviceBehavior, instance, new Uri[0])
3939
{
4040
}
41+
42+
/// <summary>
43+
/// Initializes a new instance of the <see cref="NinjectWebServiceHost{T}"/> class.
44+
/// </summary>
45+
/// <param name="serviceBehavior">The service behavior.</param>
46+
public NinjectWebServiceHost(IServiceBehavior serviceBehavior)
47+
: base(serviceBehavior, new Uri[0])
48+
{
49+
}
4150
}
4251
}

0 commit comments

Comments
 (0)