Skip to content

Commit 15b22a0

Browse files
committed
Switch from Funq to Unity IoC
1 parent eff7929 commit 15b22a0

16 files changed

+154
-83
lines changed

IntegrationEngine.Core/IntegrationEngine.Core.csproj

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,9 @@
3535
<Reference Include="Elasticsearch.Net">
3636
<HintPath>..\packages\Elasticsearch.Net.1.3.1\lib\Elasticsearch.Net.dll</HintPath>
3737
</Reference>
38-
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
39-
<SpecificVersion>False</SpecificVersion>
40-
<HintPath>..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.dll</HintPath>
41-
</Reference>
42-
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
43-
<SpecificVersion>False</SpecificVersion>
44-
<HintPath>..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath>
45-
</Reference>
4638
<Reference Include="log4net">
4739
<HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
4840
</Reference>
49-
<Reference Include="MySql.Data, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
50-
<Private>True</Private>
51-
<HintPath>..\packages\MySql.Data.6.9.5\lib\net45\MySql.Data.dll</HintPath>
52-
</Reference>
53-
<Reference Include="MySql.Data.Entity.EF6, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
54-
<HintPath>..\packages\MySql.Data.Entity.6.9.5\lib\net45\MySql.Data.Entity.EF6.dll</HintPath>
55-
</Reference>
5641
<Reference Include="Nest">
5742
<HintPath>..\packages\NEST.1.3.1\lib\Nest.dll</HintPath>
5843
</Reference>
@@ -70,6 +55,18 @@
7055
<Reference Include="Microsoft.CSharp" />
7156
<Reference Include="System.Data" />
7257
<Reference Include="System.Xml" />
58+
<Reference Include="EntityFramework">
59+
<HintPath>..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.dll</HintPath>
60+
</Reference>
61+
<Reference Include="EntityFramework.SqlServer">
62+
<HintPath>..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath>
63+
</Reference>
64+
<Reference Include="MySql.Data, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
65+
<HintPath>..\packages\MySql.Data.6.9.5\lib\net45\MySql.Data.dll</HintPath>
66+
</Reference>
67+
<Reference Include="MySql.Data.Entity.EF6, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
68+
<HintPath>..\packages\MySql.Data.Entity.6.9.5\lib\net45\MySql.Data.Entity.EF6.dll</HintPath>
69+
</Reference>
7370
</ItemGroup>
7471
<ItemGroup>
7572
<Compile Include="Configuration\DatabaseConfiguration.cs" />

IntegrationEngine.userprefs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
<Properties>
22
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
3-
<MonoDevelop.Ide.Workbench ActiveDocument="IntegrationEngine/EngineConfiguration.cs">
3+
<MonoDevelop.Ide.Workbench ActiveDocument="IntegrationEngine/EngineHostConfiguration.cs">
44
<Files>
5-
<File FileName="IntegrationEngine.ConsoleHost/IntegrationEngine.json" Line="1" Column="1" />
6-
<File FileName="IntegrationEngine/Configuration/EngineJsonConfiguration.cs" Line="11" Column="11" />
7-
<File FileName="IntegrationEngine/EngineConfiguration.cs" Line="1" Column="1" />
8-
<File FileName="IntegrationEngine/packages.config" Line="1" Column="1" />
9-
<File FileName="IntegrationEngine.Core/Mail/MailClient.cs" Line="1" Column="1" />
5+
<File FileName="IntegrationEngine/Container.cs" Line="3" Column="3" />
6+
<File FileName="IntegrationEngine/Api/Startup.cs" Line="13" Column="13" />
7+
<File FileName="IntegrationEngine/Api/Controllers/CronTriggerController.cs" Line="1" Column="1" />
8+
<File FileName="IntegrationEngine/MessageQueue/RabbitMqClient.cs" Line="43" Column="43" />
9+
<File FileName="IntegrationEngine/EngineHostConfiguration.cs" Line="10" Column="10" />
10+
<File FileName="IntegrationEngine.Core/Storage/IRepository.cs" Line="1" Column="1" />
11+
<File FileName="IntegrationEngine.Core/Storage/ESRepository.cs" Line="36" Column="36" />
1012
</Files>
1113
</MonoDevelop.Ide.Workbench>
1214
<MonoDevelop.Ide.DebuggingService.Breakpoints>
13-
<BreakpointStore />
15+
<BreakpointStore>
16+
<Breakpoint file="/Users/ethanhann/Projects/IntegrationEngine/IntegrationEngine/Api/Controllers/CronTriggerController.cs" line="17" column="1" />
17+
<Breakpoint file="/Users/ethanhann/Projects/IntegrationEngine/IntegrationEngine/Api/Controllers/CronTriggerController.cs" line="23" column="1" />
18+
<Breakpoint file="/Users/ethanhann/Projects/IntegrationEngine/IntegrationEngine/Api/Controllers/CronTriggerController.cs" line="30" column="1" />
19+
</BreakpointStore>
1420
</MonoDevelop.Ide.DebuggingService.Breakpoints>
1521
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
1622
</Properties>

IntegrationEngine/Api/Controllers/CronTriggerController.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,18 @@ namespace IntegrationEngine.Api.Controllers
99
{
1010
public class CronTriggerController : ApiController
1111
{
12-
public IRepository<CronTrigger> Repository { get; set; }
12+
public ESRepository<CronTrigger> Repository { get; set; }
1313
public IEngineScheduler EngineScheduler { get; set; }
1414

1515
public CronTriggerController()
1616
{
17-
Repository = Container.TryResolve<ESRepository<CronTrigger>>();
18-
EngineScheduler = Container.TryResolve<IEngineScheduler>();
17+
}
18+
19+
public CronTriggerController(ESRepository<CronTrigger> repository, IEngineScheduler engineScheduler)
20+
: this()
21+
{
22+
Repository = repository;
23+
EngineScheduler = engineScheduler;
1924
}
2025

2126
// GET api/IntegrationJob

IntegrationEngine/Api/Controllers/SimpleTriggerController.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@ namespace IntegrationEngine.Api.Controllers
1616
public class SimpleTriggerController : ApiController
1717
{
1818
public IRepository<SimpleTrigger> Repository { get; set; }
19+
1920
public SimpleTriggerController()
21+
{}
22+
23+
public SimpleTriggerController(ESRepository<SimpleTrigger> repository)
24+
: this()
2025
{
21-
Repository = Container.Resolve<ESRepository<SimpleTrigger>>();
26+
Repository = repository;
2227
}
2328

2429
// GET api/IntegrationJob

IntegrationEngine/Api/IntegrationEngineApi.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
using Microsoft.Owin.Hosting;
1+
using System.Web.Http;
22
using Microsoft.Owin.Host.HttpListener;
3+
using Microsoft.Owin.Hosting;
34

45
namespace IntegrationEngine.Api
56
{

IntegrationEngine/Api/Startup.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using Microsoft.Owin;
22
using Owin;
3+
using System.Linq;
34
using System.Web.Http;
5+
using Microsoft.Practices.Unity;
46

57
[assembly: OwinStartup(typeof(IntegrationEngine.Api.Startup))]
68

@@ -11,6 +13,7 @@ public class Startup
1113
public void Configuration(IAppBuilder appBuilder)
1214
{
1315
var config = new HttpConfiguration();
16+
config.DependencyResolver = new ContainerResolver(ContainerSingleton.GetContainer());
1417
config.EnableCors();
1518
config.Routes.MapHttpRoute(
1619
name: "DefaultApi",

IntegrationEngine/Container.cs

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Web.Http.Dependencies;
3+
using Microsoft.Practices.Unity;
4+
using System.Collections.Generic;
5+
6+
namespace IntegrationEngine
7+
{
8+
public class ContainerResolver : IDependencyResolver
9+
{
10+
protected IUnityContainer container;
11+
12+
public ContainerResolver(IUnityContainer container)
13+
{
14+
if (container == null)
15+
throw new ArgumentNullException("container");
16+
this.container = container;
17+
}
18+
19+
public object GetService(Type serviceType)
20+
{
21+
try
22+
{
23+
return container.Resolve(serviceType);
24+
}
25+
catch (ResolutionFailedException)
26+
{
27+
return null;
28+
}
29+
}
30+
31+
public IEnumerable<object> GetServices(Type serviceType)
32+
{
33+
try
34+
{
35+
return container.ResolveAll(serviceType);
36+
}
37+
catch (ResolutionFailedException)
38+
{
39+
return new List<object>();
40+
}
41+
}
42+
43+
public IDependencyScope BeginScope()
44+
{
45+
return new ContainerResolver(container.CreateChildContainer());
46+
}
47+
48+
public void Dispose()
49+
{
50+
container.Dispose();
51+
}
52+
}
53+
}
54+

IntegrationEngine/ContainerSingleton.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
using System;
2-
using FunqContainer = Funq.Container;
2+
using Microsoft.Practices.Unity;
33

44
namespace IntegrationEngine
55
{
66
internal class ContainerSingleton
77
{
8-
private static FunqContainer _instance;
8+
private static IUnityContainer _instance;
99
private ContainerSingleton() {}
1010

11-
public static FunqContainer GetContainer()
11+
public static IUnityContainer GetContainer()
1212
{
1313
if (_instance == null)
14-
_instance = new FunqContainer();
14+
_instance = new UnityContainer();
1515
return _instance;
1616
}
1717
}

IntegrationEngine/EngineHostConfiguration.cs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@
1414
using System.Collections.Generic;
1515
using System.Linq;
1616
using System.Reflection;
17+
using log4net.Core;
18+
using Microsoft.Practices.Unity;
19+
using System.Data.Entity.Core.Metadata.Edm;
1720

1821
namespace IntegrationEngine
1922
{
2023
public class EngineHostConfiguration
2124
{
25+
public IUnityContainer Container { get; set; }
2226
public EngineConfiguration Configuration { get; set; }
2327
public IList<Type> IntegrationJobTypes { get; set; }
2428

@@ -28,6 +32,7 @@ public EngineHostConfiguration()
2832

2933
public void Configure(IList<Assembly> assembliesWithJobs)
3034
{
35+
Container = ContainerSingleton.GetContainer();
3136
IntegrationJobTypes = assembliesWithJobs
3237
.SelectMany(x => x.GetTypes())
3338
.Where(x => typeof(IIntegrationJob).IsAssignableFrom(x) && x.IsClass)
@@ -60,19 +65,18 @@ static void TryAndLogFailure(string description, Action action)
6065
public void LoadConfiguration()
6166
{
6267
Configuration = new EngineConfiguration();
63-
Container.Register<EngineConfiguration>(Configuration);
68+
Container.RegisterInstance<EngineConfiguration>(Configuration);
6469
}
6570

6671
public void SetupLogging()
6772
{
6873
var log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
69-
Container.Register<ILog>(log);
74+
Container.RegisterInstance<ILog>(log);
7075
}
7176

7277
public void SetupDatabaseRepository()
7378
{
74-
var dbContext = new DatabaseInitializer(Configuration.Database).GetDbContext();
75-
Container.Register<IntegrationEngineContext>(dbContext);
79+
Container.RegisterInstance<IntegrationEngineContext>(new DatabaseInitializer(Configuration.Database).GetDbContext());
7680
}
7781

7882
public void SetupApi()
@@ -87,7 +91,8 @@ public void SetupMailClient()
8791
MailConfiguration = Configuration.Mail,
8892
Log = Container.Resolve<ILog>(),
8993
};
90-
Container.Register<IMailClient>(mailClient);
94+
95+
Container.RegisterInstance<IMailClient>(mailClient);
9196
}
9297

9398
public void SetupMessageQueueListener()
@@ -96,6 +101,10 @@ public void SetupMessageQueueListener()
96101
IntegrationJobTypes = IntegrationJobTypes,
97102
MessageQueueConnection = new MessageQueueConnection(Configuration.MessageQueue),
98103
MessageQueueConfiguration = Configuration.MessageQueue,
104+
Log = Container.Resolve<ILog>(),
105+
MailClient = Container.Resolve<IMailClient>(),
106+
IntegrationEngineContext = Container.Resolve<IntegrationEngineContext>(),
107+
ElasticClient = Container.Resolve<IElasticClient>(),
99108
};
100109
rabbitMqListener.Listen();
101110
}
@@ -105,17 +114,19 @@ public void SetupMessageQueueClient()
105114
var messageQueueClient = new RabbitMqClient() {
106115
MessageQueueConnection = new MessageQueueConnection(Configuration.MessageQueue),
107116
MessageQueueConfiguration = Configuration.MessageQueue,
117+
Log = Container.Resolve<ILog>(),
108118
};
109-
Container.Register<IMessageQueueClient>(messageQueueClient);
119+
Container.RegisterInstance<IMessageQueueClient>(messageQueueClient);
110120
}
111121

112122
public void SetupScheduler()
113123
{
114124
var engineScheduler = new EngineScheduler() {
115125
Scheduler = StdSchedulerFactory.GetDefaultScheduler(),
116126
IntegrationJobTypes = IntegrationJobTypes,
127+
MessageQueueClient = Container.Resolve<IMessageQueueClient>(),
117128
};
118-
Container.Register<IEngineScheduler>(engineScheduler);
129+
Container.RegisterInstance<IEngineScheduler>(engineScheduler);
119130
engineScheduler.Start();
120131
var simpleTriggers = Container.Resolve<IElasticClient>().Search<SimpleTrigger>(x => x).Documents;
121132
var cronTriggers = Container.Resolve<IElasticClient>().Search<CronTrigger>(x => x).Documents;
@@ -131,7 +142,7 @@ public void SetupScheduler()
131142

132143
public void SetupRScriptRunner()
133144
{
134-
Container.Register<RScriptRunner>(new RScriptRunner());
145+
Container.RegisterInstance<RScriptRunner>(new RScriptRunner());
135146
}
136147

137148
public void SetupElasticClient()
@@ -140,11 +151,12 @@ public void SetupElasticClient()
140151
var serverUri = new UriBuilder(config.Protocol, config.HostName, config.Port).Uri;
141152
var settings = new ConnectionSettings(serverUri, config.DefaultIndex);
142153
var elasticClient = new ElasticClient(settings);
143-
Container.Register<IElasticClient>(elasticClient);
144-
Container.Register<ESRepository<SimpleTrigger>>(new ESRepository<SimpleTrigger>() {
154+
155+
Container.RegisterInstance<IElasticClient>(elasticClient);
156+
Container.RegisterInstance<ESRepository<SimpleTrigger>>(new ESRepository<SimpleTrigger>() {
145157
ElasticClient = elasticClient
146158
});
147-
Container.Register<ESRepository<CronTrigger>>(new ESRepository<CronTrigger>() {
159+
Container.RegisterInstance<ESRepository<CronTrigger>>(new ESRepository<CronTrigger>() {
148160
ElasticClient = elasticClient
149161
});
150162
}

0 commit comments

Comments
 (0)