diff --git a/NzbDrone.Api/NzbDrone.Api.csproj b/NzbDrone.Api/NzbDrone.Api.csproj index 5d3e88e44..7658d8bd1 100644 --- a/NzbDrone.Api/NzbDrone.Api.csproj +++ b/NzbDrone.Api/NzbDrone.Api.csproj @@ -70,6 +70,9 @@ False ..\packages\NLog.2.0.1.2\lib\net40\NLog.dll + + ..\packages\ValueInjecter.2.3.3\lib\net35\Omu.ValueInjecter.dll + diff --git a/NzbDrone.Api/Series/SeriesModule.cs b/NzbDrone.Api/Series/SeriesModule.cs index 166357fa1..43e40d9a2 100644 --- a/NzbDrone.Api/Series/SeriesModule.cs +++ b/NzbDrone.Api/Series/SeriesModule.cs @@ -6,16 +6,15 @@ using FluentValidation; using Nancy; using NzbDrone.Api.Extensions; +using NzbDrone.Api.REST; using NzbDrone.Common; -using NzbDrone.Core.Datastore; -using NzbDrone.Core.Jobs.Implementations; using NzbDrone.Core.Tv; using NzbDrone.Core.Jobs; using NzbDrone.Core.Model; namespace NzbDrone.Api.Series { - public class SeriesModule : NzbDroneApiModule + public class SeriesModule : RestModule { private readonly ISeriesService _seriesService; private readonly IJobController _jobProvider; diff --git a/NzbDrone.Api/Series/SeriesResource.cs b/NzbDrone.Api/Series/SeriesResource.cs index a83b0e8b6..478bc9a39 100644 --- a/NzbDrone.Api/Series/SeriesResource.cs +++ b/NzbDrone.Api/Series/SeriesResource.cs @@ -1,17 +1,11 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using NzbDrone.Api.QualityProfiles; -using NzbDrone.Core.Model; -using NzbDrone.Core.Qualities; +using NzbDrone.Api.REST; namespace NzbDrone.Api.Series { - public class SeriesResource + public class SeriesResource : RestResource { - public Int32 Id { get; set; } - //Todo: Sorters should be done completely on the client //Todo: Is there an easy way to keep IgnoreArticlesWhenSorting in sync between, Series, History, Missing? //Todo: We should get the entire QualityProfile instead of ID and Name separately diff --git a/NzbDrone.Api/packages.config b/NzbDrone.Api/packages.config index 3144ad997..3778d25db 100644 --- a/NzbDrone.Api/packages.config +++ b/NzbDrone.Api/packages.config @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/NzbDrone.App.Test/ContainerFixture.cs b/NzbDrone.App.Test/ContainerFixture.cs index 16bb5e02e..bcf6a5c92 100644 --- a/NzbDrone.App.Test/ContainerFixture.cs +++ b/NzbDrone.App.Test/ContainerFixture.cs @@ -14,19 +14,19 @@ public class ContainerFixture : TestBase [Test] public void should_be_able_to_resolve_event_handlers() { - ContainerBuilder.BuildNzbDroneContainer().Resolve>().Should().NotBeEmpty(); + MainAppContainerBuilder.BuildContainer().Resolve>().Should().NotBeEmpty(); } [Test] public void should_be_able_to_resolve_indexers() { - ContainerBuilder.BuildNzbDroneContainer().Resolve>().Should().NotBeEmpty(); + MainAppContainerBuilder.BuildContainer().Resolve>().Should().NotBeEmpty(); } [Test] public void should_be_able_to_resolve_downlodclients() { - ContainerBuilder.BuildNzbDroneContainer().Resolve>().Should().NotBeEmpty(); + MainAppContainerBuilder.BuildContainer().Resolve>().Should().NotBeEmpty(); } } } \ No newline at end of file diff --git a/NzbDrone.Common/ContainerBuilderBase.cs b/NzbDrone.Common/ContainerBuilderBase.cs new file mode 100644 index 000000000..fefb85333 --- /dev/null +++ b/NzbDrone.Common/ContainerBuilderBase.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using TinyIoC; + +namespace NzbDrone.Common +{ + public abstract class ContainerBuilderBase + { + protected TinyIoCContainer Container; + private readonly List _loadedTypes; + + protected ContainerBuilderBase(params string[] assemblies) + { + Container = new TinyIoCContainer(); + + _loadedTypes = new List(); + + foreach (var assembly in assemblies) + { + _loadedTypes.AddRange(Assembly.Load(assembly).GetTypes()); + } + + AutoRegisterInterfaces(); + } + + private void AutoRegisterInterfaces() + { + var interfaces = _loadedTypes.Where(t => t.IsInterface); + + foreach (var contract in interfaces) + { + AutoRegisterImplementations(contract); + } + } + + protected void AutoRegisterImplementations() + { + AutoRegisterImplementations(typeof(TContract)); + } + + private void AutoRegisterImplementations(Type contractType) + { + var implementations = GetImplementations(contractType).ToList(); + + if (implementations.Count == 0) + { + return; + } + if (implementations.Count == 1) + { + Container.Register(contractType, implementations.Single()).AsMultiInstance(); + } + else + { + Container.RegisterMultiple(contractType, implementations).AsMultiInstance(); + } + } + + private IEnumerable GetImplementations(Type contractType) + { + return _loadedTypes + .Where(implementation => + contractType.IsAssignableFrom(implementation) && + !implementation.IsInterface && + !implementation.IsAbstract + ); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index 2e8709719..3013d0545 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -1,4 +1,4 @@ - + Debug @@ -84,6 +84,7 @@ + diff --git a/NzbDrone.Core/packages.config b/NzbDrone.Core/packages.config index 5e6b29805..6afbdc990 100644 --- a/NzbDrone.Core/packages.config +++ b/NzbDrone.Core/packages.config @@ -1,4 +1,4 @@ - + diff --git a/NzbDrone.Integration.Test/SmokeTestBase.cs b/NzbDrone.Integration.Test/SmokeTestBase.cs index 6486015d6..a9d981672 100644 --- a/NzbDrone.Integration.Test/SmokeTestBase.cs +++ b/NzbDrone.Integration.Test/SmokeTestBase.cs @@ -69,7 +69,7 @@ private void InitDatabase() [SetUp] public void SmokeTestSetup() { - Container = ContainerBuilder.BuildNzbDroneContainer(); + Container = MainAppContainerBuilder.BuildContainer(); InitDatabase(); diff --git a/NzbDrone.Update/NzbDrone.Update.csproj b/NzbDrone.Update/NzbDrone.Update.csproj index 1d65081f4..cb7ee1597 100644 --- a/NzbDrone.Update/NzbDrone.Update.csproj +++ b/NzbDrone.Update/NzbDrone.Update.csproj @@ -55,13 +55,6 @@ MinimumRecommendedRules.ruleset - - False - ..\packages\Autofac.3.0.1\lib\net40\Autofac.dll - - - ..\packages\Autofac.3.0.1\lib\net40\Autofac.Configuration.dll - False ..\packages\Exceptron.Client.1.0.20\lib\net20\Exceptron.Client.dll @@ -84,6 +77,7 @@ + diff --git a/NzbDrone.Update/Program.cs b/NzbDrone.Update/Program.cs index daf500e89..17311ac4b 100644 --- a/NzbDrone.Update/Program.cs +++ b/NzbDrone.Update/Program.cs @@ -1,9 +1,9 @@ using System; using System.IO; -using Autofac; using NLog; using NzbDrone.Common; using NzbDrone.Update.Providers; +using TinyIoC; namespace NzbDrone.Update { @@ -11,7 +11,7 @@ public class Program { private readonly UpdateProvider _updateProvider; private readonly ProcessProvider _processProvider; - private static IContainer _container; + private static TinyIoCContainer _container; private static readonly Logger logger = LogManager.GetCurrentClassLogger(); @@ -26,10 +26,8 @@ public static void Main(string[] args) try { Console.WriteLine("Starting NzbDrone Update Client"); - var builder = new ContainerBuilder(); - builder.RegisterAssemblyTypes(typeof(UpdateProvider).Assembly).SingleInstance(); - builder.RegisterAssemblyTypes(typeof(RestProvider).Assembly).SingleInstance(); - _container = builder.Build(); + + _container = UpdateContainerBuilder.Build(); logger.Info("Updating NzbDrone to version {0}", _container.Resolve().Version); _container.Resolve().Start(args); diff --git a/NzbDrone.Update/UpdateContainerBuilder.cs b/NzbDrone.Update/UpdateContainerBuilder.cs new file mode 100644 index 000000000..102b32b22 --- /dev/null +++ b/NzbDrone.Update/UpdateContainerBuilder.cs @@ -0,0 +1,19 @@ +using NzbDrone.Common; +using TinyIoC; + +namespace NzbDrone.Update +{ + public class UpdateContainerBuilder : ContainerBuilderBase + { + public UpdateContainerBuilder() + : base("NzbDrone.Update", "NzbDrone.Common") + { + + } + + public static TinyIoCContainer Build() + { + return new UpdateContainerBuilder().Container; + } + } +} \ No newline at end of file diff --git a/NzbDrone.Update/packages.config b/NzbDrone.Update/packages.config index 789e746ef..974363ad4 100644 --- a/NzbDrone.Update/packages.config +++ b/NzbDrone.Update/packages.config @@ -1,6 +1,5 @@  - diff --git a/NzbDrone.ncrunchsolution b/NzbDrone.ncrunchsolution index c725a019c..969da6dd4 100644 --- a/NzbDrone.ncrunchsolution +++ b/NzbDrone.ncrunchsolution @@ -2,6 +2,7 @@ 1 True true + true UseDynamicAnalysis Disabled Disabled diff --git a/NzbDrone/AppMain.cs b/NzbDrone/AppMain.cs index 11014e85c..19a94281c 100644 --- a/NzbDrone/AppMain.cs +++ b/NzbDrone/AppMain.cs @@ -41,7 +41,7 @@ public static void Main(string[] args) return; } - var container = ContainerBuilder.BuildNzbDroneContainer(); + var container = MainAppContainerBuilder.BuildContainer(); container.Resolve().Route(args); } diff --git a/NzbDrone/ContainerBuilder.cs b/NzbDrone/ContainerBuilder.cs deleted file mode 100644 index 2fa521394..000000000 --- a/NzbDrone/ContainerBuilder.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using FluentMigrator.Runner; -using NLog; -using Nancy.Bootstrapper; -using NzbDrone.Api; -using NzbDrone.Common; -using NzbDrone.Common.Eventing; -using NzbDrone.Core.Datastore; -using NzbDrone.Core.Datastore.Migration.Framework; -using NzbDrone.Core.ExternalNotification; -using NzbDrone.Core.Organizer; -using NzbDrone.Core.RootFolders; -using TinyIoC; - -namespace NzbDrone -{ - public static class ContainerBuilder - { - private static readonly Logger Logger = LogManager.GetLogger("ContainerBuilder"); - private static readonly List NzbDroneTypes; - - static ContainerBuilder() - { - NzbDroneTypes = new List(); - NzbDroneTypes.AddRange(Assembly.Load("NzbDrone").GetTypes()); - NzbDroneTypes.AddRange(Assembly.Load("NzbDrone.Common").GetTypes()); - NzbDroneTypes.AddRange(Assembly.Load("NzbDrone.Core").GetTypes()); - NzbDroneTypes.AddRange(Assembly.Load("NzbDrone.Api").GetTypes()); - } - - public static TinyIoCContainer BuildNzbDroneContainer() - { - var container = new TinyIoCContainer(); - - container.AutoRegisterInterfaces(); - - container.AutoRegisterImplementations(); - - container.Register().AsSingleton(); - container.Register().AsSingleton(); - container.Register().AsSingleton(); - container.Register().AsSingleton(); - - container.Register(typeof(IBasicRepository), typeof(BasicRepository)).AsMultiInstance(); - container.Register(typeof(IBasicRepository), typeof(BasicRepository)).AsMultiInstance(); - - container.InitDatabase(); - - ReportingService.RestProvider = container.Resolve(); - - return container; - } - - private static void InitDatabase(this TinyIoCContainer container) - { - Logger.Info("Registering Database..."); - - //TODO: move this to factory - var environmentProvider = new EnvironmentProvider(); - var appDataPath = environmentProvider.GetAppDataPath(); - - if (!Directory.Exists(appDataPath)) - { - Directory.CreateDirectory(appDataPath); - } - - container.Register((c, p) => c.Resolve().Create(environmentProvider.GetNzbDroneDatabase())); - } - - private static void AutoRegisterInterfaces(this TinyIoCContainer container) - { - var interfaces = NzbDroneTypes.Where(t => t.IsInterface); - - foreach (var contract in interfaces) - { - container.AutoRegisterImplementations(contract); - } - } - - - private static void AutoRegisterImplementations(this TinyIoCContainer container) - { - container.AutoRegisterImplementations(typeof(TContract)); - } - - private static void AutoRegisterImplementations(this TinyIoCContainer container, Type contractType) - { - var implementations = GetImplementations(contractType).ToList(); - - if (implementations.Count == 0) - { - return; - } - if (implementations.Count == 1) - { - container.Register(contractType, implementations.Single()).AsMultiInstance(); - } - else - { - container.RegisterMultiple(contractType, implementations).AsMultiInstance(); - } - } - - private static IEnumerable GetImplementations(Type contractType) - { - return NzbDroneTypes - .Where(implementation => - contractType.IsAssignableFrom(implementation) && - !implementation.IsInterface && - !implementation.IsAbstract - ); - } - } -} \ No newline at end of file diff --git a/NzbDrone/MainAppContainerBuilder.cs b/NzbDrone/MainAppContainerBuilder.cs new file mode 100644 index 000000000..4dbff5131 --- /dev/null +++ b/NzbDrone/MainAppContainerBuilder.cs @@ -0,0 +1,61 @@ +using System.IO; +using FluentMigrator.Runner; +using NLog; +using Nancy.Bootstrapper; +using NzbDrone.Api; +using NzbDrone.Common; +using NzbDrone.Common.Eventing; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Datastore.Migration.Framework; +using NzbDrone.Core.ExternalNotification; +using NzbDrone.Core.Organizer; +using NzbDrone.Core.RootFolders; +using TinyIoC; + +namespace NzbDrone +{ + public class MainAppContainerBuilder : ContainerBuilderBase + { + private static readonly Logger Logger = LogManager.GetLogger("ContainerBuilderBase"); + + public static TinyIoCContainer BuildContainer() + { + return new MainAppContainerBuilder().Container; + } + + + private MainAppContainerBuilder() + : base("NzbDrone", "NzbDrone.Common", "NzbDrone.Core", "NzbDrone.Api") + { + AutoRegisterImplementations(); + + Container.Register().AsSingleton(); + Container.Register().AsSingleton(); + Container.Register().AsSingleton(); + Container.Register().AsSingleton(); + + Container.Register(typeof(IBasicRepository), typeof(BasicRepository)).AsMultiInstance(); + Container.Register(typeof(IBasicRepository), typeof(BasicRepository)).AsMultiInstance(); + + InitDatabase(); + + ReportingService.RestProvider = Container.Resolve(); + } + + private void InitDatabase() + { + Logger.Info("Registering Database..."); + + //TODO: move this to factory + var environmentProvider = new EnvironmentProvider(); + var appDataPath = environmentProvider.GetAppDataPath(); + + if (!Directory.Exists(appDataPath)) + { + Directory.CreateDirectory(appDataPath); + } + + Container.Register((c, p) => c.Resolve().Create(environmentProvider.GetNzbDroneDatabase())); + } + } +} \ No newline at end of file diff --git a/NzbDrone/NzbDrone.csproj b/NzbDrone/NzbDrone.csproj index 538ad4313..02173c068 100644 --- a/NzbDrone/NzbDrone.csproj +++ b/NzbDrone/NzbDrone.csproj @@ -118,7 +118,7 @@ Component - +