Skip to content

Commit 35068f0

Browse files
committed
Eliminate container singleton
1 parent b39a613 commit 35068f0

15 files changed

Lines changed: 73 additions & 97 deletions

File tree

IntegrationEngine.Tests/Api/TriggerControllerBaseTest.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public void ShouldScheduleJobWhenTriggerIsCreated()
9494
};
9595
MockElasticRepo.Setup(x => x.Insert(triggerWithoutId)).Returns(expected);
9696
MockEngineScheduler.Setup(x => x.ScheduleJobWithTrigger(expected));
97+
MockEngineScheduler.Setup(x => x.IsJobTypeRegistered(jobType)).Returns(true);
9798

9899
Subject.Post(triggerWithoutId);
99100

@@ -128,5 +129,26 @@ public void ShouldReturnNotFoundAndNotAttemptToDeleteTriggerIfItDoesNotExist()
128129
MockElasticRepo.Verify(x => x.Delete<TriggerStub>(TriggerDocumentId), Times.Never);
129130
MockEngineScheduler.Verify(x => x.DeleteTrigger(It.IsAny<TriggerStub>()), Times.Never);
130131
}
132+
133+
[Test]
134+
public void ShouldValidateJobTypeAgainstSchedulersRegisteredJobs()
135+
{
136+
var jobTypeName = "MyIntegrationServer.MyIntegrationJob";
137+
MockEngineScheduler.Setup(x => x.IsJobTypeRegistered(jobTypeName)).Returns(true);
138+
139+
var actual = Subject.IsValidJobType(jobTypeName);
140+
141+
MockEngineScheduler.Verify(x => x.IsJobTypeRegistered(jobTypeName), Times.Once);
142+
Assert.That(actual, Is.True);
143+
}
144+
145+
[Test]
146+
public void ShouldReturnTrueIfJobTypeNameIsNotValid()
147+
{
148+
var actual = Subject.IsValidJobType(null);
149+
150+
MockEngineScheduler.Verify(x => x.IsJobTypeRegistered(It.IsAny<string>()), Times.Never);
151+
Assert.That(actual, Is.True);
152+
}
131153
}
132154
}

IntegrationEngine.userprefs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
<Properties StartupItem="IntegrationServer/IntegrationServer.csproj">
22
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
3-
<MonoDevelop.Ide.Workbench ActiveDocument="IntegrationEngine.Tests/EngineHostCompositionRootTest.cs">
4-
<Files>
5-
<File FileName="IntegrationServer/IntegrationJobs/CarReport/CarMailMessageJob.cs" Line="1" Column="1" />
6-
<File FileName="IntegrationServer.Tests/IntegrationJobs/CarReport/CarMailMessageJobTest.cs" Line="13" Column="13" />
7-
<File FileName="IntegrationEngine/EngineHostCompositionRoot.cs" Line="46" Column="46" />
8-
<File FileName="IntegrationEngine.Tests/EngineHostCompositionRootTest.cs" Line="52" Column="52" />
9-
<File FileName="IntegrationServer/Program.cs" Line="1" Column="1" />
10-
</Files>
3+
<MonoDevelop.Ide.Workbench>
114
<Pads>
125
<Pad Id="MonoDevelop.NUnit.TestPad">
136
<State expanded="True" selected="True" />

IntegrationEngine/Api/TriggerControllerBase.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public IHttpActionResult Put(string id, T trigger)
4343
return BadRequest();
4444
if (!ModelState.IsValid)
4545
return BadRequest(ModelState);
46+
if (!IsValidJobType(trigger.JobType))
47+
return BadRequest(string.Format("JobType is not registered: {0}", trigger.JobType));
4648
var updatedTrigger = Repository.Update(trigger);
4749
EngineScheduler.ScheduleJobWithTrigger(updatedTrigger);
4850
return Ok(updatedTrigger);
@@ -54,6 +56,8 @@ public IHttpActionResult Post(T trigger)
5456
{
5557
if (!ModelState.IsValid)
5658
return BadRequest(ModelState);
59+
if (!IsValidJobType(trigger.JobType))
60+
return BadRequest(string.Format("JobType is not registered: {0}", trigger.JobType));
5761
var triggerWithId = Repository.Insert(trigger);
5862
EngineScheduler.ScheduleJobWithTrigger(triggerWithId);
5963
return CreatedAtRoute("DefaultApi", new { id = triggerWithId.Id }, triggerWithId);
@@ -70,5 +74,21 @@ public IHttpActionResult Delete(string id)
7074
EngineScheduler.DeleteTrigger(trigger);
7175
return Ok(trigger);
7276
}
77+
78+
/// <summary>
79+
/// Determines whether this instance is valid JobType given a jobTypeName.
80+
/// </summary>
81+
/// <returns><c>true</c> if the jobTypeName is the name of a registered JobType; otherwise, <c>false</c>.
82+
/// Also, return <c>true</c> if the jobTypeName is an empty string, because returning <c>false</c>
83+
/// would mean that the JobType is required which is an additional constraint - it is not
84+
/// the responsibility of this method to enforce that constraint.
85+
/// </returns>
86+
/// <param name="jobTypeName">The fully qualified name of a JobType.</param>
87+
public bool IsValidJobType(string jobTypeName)
88+
{
89+
if (string.IsNullOrEmpty(jobTypeName))
90+
return true;
91+
return EngineScheduler.IsJobTypeRegistered(jobTypeName);
92+
}
7393
}
7494
}

IntegrationEngine/Api/WebApiApplication.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,40 @@
11
using IntegrationEngine.Core.Configuration;
22
using Microsoft.Owin.Hosting;
33
using System;
4+
using System.Web.Http;
5+
using Microsoft.Practices.Unity;
6+
using System.Linq;
7+
using System.Web.Http.Cors;
8+
using Owin;
49

510
namespace IntegrationEngine.Api
611
{
712
public class WebApiApplication : IWebApiApplication
813
{
914
public IDisposable webApi { get; set; }
1015
public WebApiConfiguration WebApiConfiguration { get; set; }
16+
public ContainerResolver ContainerResolver { get; set; }
1117

1218
public WebApiApplication()
13-
{ }
19+
{}
1420

1521
public void Start()
1622
{
1723
var baseAddress = (new UriBuilder("http", WebApiConfiguration.HostName, WebApiConfiguration.Port)).Uri.AbsoluteUri;
18-
webApi = WebApp.Start<WebApiStartup>(baseAddress);
24+
Action<Owin.IAppBuilder> startup = x => {
25+
var config = new HttpConfiguration();
26+
config.DependencyResolver = ContainerResolver;
27+
// if (WebApiConfiguration != null && WebApiConfiguration.Origins.Any())
28+
// config.EnableCors(new EnableCorsAttribute(string.Join(",", WebApiConfiguration.Origins), "*", "*"));
29+
config.Routes.MapHttpRoute(
30+
name: "DefaultApi",
31+
routeTemplate: "api/{controller}/{id}",
32+
defaults: new { id = RouteParameter.Optional }
33+
);
34+
config.MapHttpAttributeRoutes();
35+
x.UseWebApi(config);
36+
};
37+
webApi = WebApp.Start(baseAddress, startup);
1938
}
2039

2140
public void Dispose()

IntegrationEngine/Api/WebApiStartup.cs

Lines changed: 0 additions & 32 deletions
This file was deleted.

IntegrationEngine/ContainerSingleton.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.

IntegrationEngine/DataAnnotations/JobTypeAttribute.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

IntegrationEngine/EngineHostCompositionRoot.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public EngineHostCompositionRoot()
4343
public EngineHostCompositionRoot(IList<Assembly> assembliesWithJobs)
4444
: this()
4545
{
46+
Container = new UnityContainer();
4647
IntegrationJobTypes = ExtractIntegrationJobTypesFromAssemblies(assembliesWithJobs);
4748
}
4849

@@ -56,7 +57,6 @@ public IList<Type> ExtractIntegrationJobTypesFromAssemblies(IList<Assembly> asse
5657

5758
public void Configure()
5859
{
59-
Container = ContainerSingleton.GetContainer();
6060
LoadConfiguration();
6161
SetupLogging();
6262
RegisterIntegrationPoints();
@@ -180,6 +180,7 @@ public void SetupThreadedListenerManager()
180180
IntegrationJobTypes = IntegrationJobTypes,
181181
MessageQueueConnection = new MessageQueueConnection(config),
182182
RabbitMQConfiguration = config,
183+
UnityContainer = Container,
183184
};
184185

185186
var threadedListenerManager = new ThreadedListenerManager() {
@@ -230,7 +231,8 @@ public void SetupRScriptRunner()
230231
public void SetupWebApi()
231232
{
232233
WebApiApplication = new WebApiApplication() {
233-
WebApiConfiguration = EngineConfiguration.WebApi
234+
WebApiConfiguration = EngineConfiguration.WebApi,
235+
ContainerResolver = new ContainerResolver(Container)
234236
};
235237
WebApiApplication.Start();
236238
}

IntegrationEngine/IntegrationEngine.csproj

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@
156156
</Compile>
157157
<Compile Include="Api\IWebApiApplication.cs" />
158158
<Compile Include="Api\WebApiApplication.cs" />
159-
<Compile Include="Api\WebApiStartup.cs" />
160159
<Compile Include="DataAnnotations\CronExpressionStringAttribute.cs" />
161160
<Compile Include="Scheduler\Dispatcher.cs" />
162161
<Compile Include="Scheduler\CronTrigger.cs" />
@@ -167,14 +166,12 @@
167166
<Compile Include="Properties\AssemblyInfo.cs" />
168167
<Compile Include="EngineHost.cs" />
169168
<Compile Include="Scheduler\IntegrationJobDispatcherJob.cs" />
170-
<Compile Include="ContainerSingleton.cs" />
171169
<Compile Include="Api\Controllers\SimpleTriggerController.cs" />
172170
<Compile Include="Api\Controllers\CronTriggerController.cs" />
173171
<Compile Include="ContainerResolver.cs" />
174172
<Compile Include="Scheduler\EngineScheduler.cs" />
175173
<Compile Include="Scheduler\IEngineScheduler.cs" />
176174
<Compile Include="Api\Controllers\JobTypeController.cs" />
177-
<Compile Include="DataAnnotations\JobTypeAttribute.cs" />
178175
<Compile Include="Api\Controllers\HealthStatusController.cs" />
179176
<Compile Include="Api\TriggerControllerBase.cs" />
180177
<Compile Include="Api\Controllers\LogEventController.cs" />

IntegrationEngine/JobProcessor/RabbitMQListener.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace IntegrationEngine.JobProcessor
1919
{
2020
public class RabbitMQListener : IMessageQueueListener
2121
{
22+
public IUnityContainer UnityContainer { get; set; }
2223
public QueueingBasicConsumer Consumer { get; set; }
2324
public IList<Type> IntegrationJobTypes { get; set; }
2425
public IRabbitMQConfiguration RabbitMQConfiguration { get; set; }
@@ -61,7 +62,7 @@ public void Listen(CancellationToken cancellationToken)
6162
if (IntegrationJobTypes != null && !IntegrationJobTypes.Any())
6263
continue;
6364
var type = IntegrationJobTypes.FirstOrDefault(t => t.FullName.Equals(message.JobType));
64-
var integrationJob = ContainerSingleton.GetContainer().Resolve(type) as IIntegrationJob;
65+
var integrationJob = UnityContainer.Resolve(type) as IIntegrationJob;
6566
if (integrationJob != null)
6667
{
6768
if (integrationJob is IParameterizedJob)

0 commit comments

Comments
 (0)