diff --git a/NzbDrone.Api/NancyBootstrapper.cs b/NzbDrone.Api/NancyBootstrapper.cs index 7203469ad..c98d0765c 100644 --- a/NzbDrone.Api/NancyBootstrapper.cs +++ b/NzbDrone.Api/NancyBootstrapper.cs @@ -44,18 +44,6 @@ namespace NzbDrone.Api return _tinyIoCContainer; } - protected override NancyInternalConfiguration InternalConfiguration - { - get - { - var internalConfig = NancyInternalConfiguration.Default; - - internalConfig.StatusCodeHandlers.Add(typeof(ErrorHandler)); - internalConfig.Serializers.Add(typeof(NancyJsonSerializer)); - - return internalConfig; - } - } protected override DiagnosticsConfiguration DiagnosticsConfiguration { @@ -76,10 +64,5 @@ namespace NzbDrone.Api return null; } } - - public void Shutdown() - { - ApplicationContainer.Resolve().PublishEvent(new ApplicationShutdownRequested()); - } } } \ No newline at end of file diff --git a/NzbDrone.Api/NzbDrone.Api.csproj b/NzbDrone.Api/NzbDrone.Api.csproj index a4bd0fb7b..b20d48df3 100644 --- a/NzbDrone.Api/NzbDrone.Api.csproj +++ b/NzbDrone.Api/NzbDrone.Api.csproj @@ -46,12 +46,13 @@ False ..\packages\Microsoft.AspNet.SignalR.Core.1.1.3\lib\net40\Microsoft.AspNet.SignalR.Core.dll - + False - ..\packages\Nancy.0.16.1\lib\net40\Nancy.dll + ..\packages\Nancy.0.18.0\lib\net40\Nancy.dll - - ..\packages\Nancy.Authentication.Basic.0.16.1\lib\net40\Nancy.Authentication.Basic.dll + + False + ..\packages\Nancy.Authentication.Basic.0.18.0\lib\net40\Nancy.Authentication.Basic.dll False diff --git a/NzbDrone.Api/TinyIoCNancyBootstrapper.cs b/NzbDrone.Api/TinyIoCNancyBootstrapper.cs index 03fef1b77..1c25f1e35 100644 --- a/NzbDrone.Api/TinyIoCNancyBootstrapper.cs +++ b/NzbDrone.Api/TinyIoCNancyBootstrapper.cs @@ -9,26 +9,51 @@ using TinyIoC; namespace NzbDrone.Api { - public abstract class TinyIoCNancyBootstrapper : NancyBootstrapperWithRequestContainerBase + public class TinyIoCNancyBootstrapper : NancyBootstrapperWithRequestContainerBase { + // + /// Default assemblies that are ignored for autoregister + /// + private static readonly IEnumerable> DefaultAutoRegisterIgnoredAssemblies = new Func[] + { + asm => !asm.FullName.StartsWith("Nancy.", StringComparison.InvariantCulture), + }; + /// - /// Resolve INancyEngine + /// Gets the assemblies to ignore when autoregistering the application container + /// Return true from the delegate to ignore that particular assembly, returning true + /// does not mean the assembly *will* be included, a false from another delegate will + /// take precedence. /// - /// INancyEngine implementation - protected override sealed INancyEngine GetEngineInternal() + protected virtual IEnumerable> AutoRegisterIgnoredAssemblies { - return ApplicationContainer.Resolve(); + get { return DefaultAutoRegisterIgnoredAssemblies; } } /// - /// Get the moduleKey generator + /// Configures the container using AutoRegister followed by registration + /// of default INancyModuleCatalog and IRouteResolver. /// - /// IModuleKeyGenerator instance - protected override sealed IModuleKeyGenerator GetModuleKeyGenerator() + /// Container instance + protected override void ConfigureApplicationContainer(TinyIoCContainer container) { - return ApplicationContainer.Resolve(); + AutoRegister(container, this.AutoRegisterIgnoredAssemblies); } + /// + /// Resolve INancyEngine + /// + /// INancyEngine implementation + protected override sealed INancyEngine GetEngineInternal() + { + return this.ApplicationContainer.Resolve(); + } + + /* protected override IModuleKeyGenerator GetModuleKeyGenerator() + { + return ApplicationContainer.Resolve(); + }*/ + /// /// Create a default, unconfigured, container /// @@ -72,7 +97,7 @@ namespace NzbDrone.Api { foreach (var collectionTypeRegistration in collectionTypeRegistrationsn) { - container.RegisterMultiple(collectionTypeRegistration.RegistrationType, collectionTypeRegistration.ImplementationTypes.Distinct()); + container.RegisterMultiple(collectionTypeRegistration.RegistrationType, collectionTypeRegistration.ImplementationTypes); } } @@ -88,8 +113,8 @@ namespace NzbDrone.Api container.Register( typeof(INancyModule), moduleRegistrationType.ModuleType, - moduleRegistrationType.ModuleKey). - AsSingleton(); + moduleRegistrationType.ModuleType.FullName). + AsSingleton(); } } @@ -114,16 +139,16 @@ namespace NzbDrone.Api /// Request container instance protected override sealed TinyIoCContainer CreateRequestContainer() { - return ApplicationContainer.GetChildContainer(); + return this.ApplicationContainer.GetChildContainer(); } /// - /// Gets the diagnostics for intialisation + /// Gets the diagnostics for initialisation /// - /// IDagnostics implementation + /// IDiagnostics implementation protected override IDiagnostics GetDiagnostics() { - return ApplicationContainer.Resolve(); + return this.ApplicationContainer.Resolve(); } /// @@ -132,7 +157,7 @@ namespace NzbDrone.Api /// An instance containing instances. protected override IEnumerable GetApplicationStartupTasks() { - return ApplicationContainer.ResolveAll(false); + return this.ApplicationContainer.ResolveAll(false); } /// @@ -141,7 +166,7 @@ namespace NzbDrone.Api /// An instance containing instances. protected override IEnumerable GetApplicationRegistrationTasks() { - return ApplicationContainer.ResolveAll(false); + return this.ApplicationContainer.ResolveAll(false); } /// @@ -156,14 +181,16 @@ namespace NzbDrone.Api } /// - /// Retreive a specific module instance from the container by its key + /// Retreive a specific module instance from the container /// /// Container to use - /// Module key of the module + /// Type of the module /// NancyModule instance - protected override sealed INancyModule GetModuleByKey(TinyIoCContainer container, string moduleKey) + protected override sealed INancyModule GetModule(TinyIoCContainer container, Type moduleType) { - return container.Resolve(moduleKey); + container.Register(typeof(INancyModule), moduleType); + + return container.Resolve(); } /// @@ -176,7 +203,7 @@ namespace NzbDrone.Api var whitelist = new Type[] { }; - container.AutoRegister(AppDomain.CurrentDomain.GetAssemblies().Where(a => !ignoredAssemblies.Any(ia => ia(a))), t => t.Assembly != assembly || whitelist.Any(wt => wt == t)); + container.AutoRegister(AppDomain.CurrentDomain.GetAssemblies().Where(a => !ignoredAssemblies.Any(ia => ia(a))), DuplicateImplementationActions.RegisterMultiple, t => t.Assembly != assembly || whitelist.Any(wt => wt == t)); } } -} \ No newline at end of file +} diff --git a/NzbDrone.Api/packages.config b/NzbDrone.Api/packages.config index fab037bf1..dff31468c 100644 --- a/NzbDrone.Api/packages.config +++ b/NzbDrone.Api/packages.config @@ -2,8 +2,8 @@ - - + + diff --git a/NzbDrone.Common/TinyIoC.cs b/NzbDrone.Common/TinyIoC.cs index 5069a05fb..90fff373f 100644 --- a/NzbDrone.Common/TinyIoC.cs +++ b/NzbDrone.Common/TinyIoC.cs @@ -22,7 +22,6 @@ // depending on platform features. If the platform has an appropriate // #DEFINE then these should be set automatically below. - #define EXPRESSIONS // Platform supports System.Linq.Expressions #define COMPILED_EXPRESSIONS // Platform supports compiling expressions #define APPDOMAIN_GETASSEMBLIES // Platform supports getting all assemblies from the AppDomain object @@ -71,12 +70,13 @@ namespace TinyIoC { using System; using System.Collections.Generic; + using System.Collections.ObjectModel; using System.Linq; using System.Reflection; - using NLog; #if EXPRESSIONS using System.Linq.Expressions; + using NLog; using System.Threading; #endif @@ -279,7 +279,7 @@ namespace TinyIoC GC.SuppressFinalize(this); } - #endregion + #endregion } #endif #endregion @@ -708,6 +708,13 @@ namespace TinyIoC Fail } + public enum DuplicateImplementationActions + { + RegisterSingle, + RegisterMultiple, + Fail + } + /// /// Resolution settings /// @@ -1025,7 +1032,7 @@ namespace TinyIoC public void AutoRegister() { #if APPDOMAIN_GETASSEMBLIES - AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), true, null); + AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), DuplicateImplementationActions.RegisterSingle, null); #else AutoRegisterInternal(new Assembly[] {this.GetType().Assembly()}, true, null); #endif @@ -1042,7 +1049,7 @@ namespace TinyIoC public void AutoRegister(Func registrationPredicate) { #if APPDOMAIN_GETASSEMBLIES - AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), true, registrationPredicate); + AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), DuplicateImplementationActions.RegisterSingle, registrationPredicate); #else AutoRegisterInternal(new Assembly[] { this.GetType().Assembly()}, true, registrationPredicate); #endif @@ -1051,12 +1058,12 @@ namespace TinyIoC /// /// Attempt to automatically register all non-generic classes and interfaces in the current app domain. /// - /// Whether to ignore duplicate implementations of an interface/base class. False=throw an exception + /// What action to take when encountering duplicate implementations of an interface/base class. /// - public void AutoRegister(bool ignoreDuplicateImplementations) + public void AutoRegister(DuplicateImplementationActions duplicateAction) { #if APPDOMAIN_GETASSEMBLIES - AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), ignoreDuplicateImplementations, null); + AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), duplicateAction, null); #else AutoRegisterInternal(new Assembly[] { this.GetType().Assembly() }, ignoreDuplicateImplementations, null); #endif @@ -1066,13 +1073,13 @@ namespace TinyIoC /// Attempt to automatically register all non-generic classes and interfaces in the current app domain. /// Types will only be registered if they pass the supplied registration predicate. /// - /// Whether to ignore duplicate implementations of an interface/base class. False=throw an exception + /// What action to take when encountering duplicate implementations of an interface/base class. /// Predicate to determine if a particular type should be registered /// - public void AutoRegister(bool ignoreDuplicateImplementations, Func registrationPredicate) + public void AutoRegister(DuplicateImplementationActions duplicateAction, Func registrationPredicate) { #if APPDOMAIN_GETASSEMBLIES - AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), ignoreDuplicateImplementations, registrationPredicate); + AutoRegisterInternal(AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a)), duplicateAction, registrationPredicate); #else AutoRegisterInternal(new Assembly[] { this.GetType().Assembly() }, ignoreDuplicateImplementations, registrationPredicate); #endif @@ -1087,7 +1094,7 @@ namespace TinyIoC /// Assemblies to process public void AutoRegister(IEnumerable assemblies) { - AutoRegisterInternal(assemblies, true, null); + AutoRegisterInternal(assemblies, DuplicateImplementationActions.RegisterSingle, null); } /// @@ -1101,18 +1108,18 @@ namespace TinyIoC /// Predicate to determine if a particular type should be registered public void AutoRegister(IEnumerable assemblies, Func registrationPredicate) { - AutoRegisterInternal(assemblies, true, registrationPredicate); + AutoRegisterInternal(assemblies, DuplicateImplementationActions.RegisterSingle, registrationPredicate); } /// /// Attempt to automatically register all non-generic classes and interfaces in the specified assemblies /// /// Assemblies to process - /// Whether to ignore duplicate implementations of an interface/base class. False=throw an exception + /// What action to take when encountering duplicate implementations of an interface/base class. /// - public void AutoRegister(IEnumerable assemblies, bool ignoreDuplicateImplementations) + public void AutoRegister(IEnumerable assemblies, DuplicateImplementationActions duplicateAction) { - AutoRegisterInternal(assemblies, ignoreDuplicateImplementations, null); + AutoRegisterInternal(assemblies, duplicateAction, null); } /// @@ -1120,12 +1127,12 @@ namespace TinyIoC /// Types will only be registered if they pass the supplied registration predicate. /// /// Assemblies to process - /// Whether to ignore duplicate implementations of an interface/base class. False=throw an exception + /// What action to take when encountering duplicate implementations of an interface/base class. /// Predicate to determine if a particular type should be registered /// - public void AutoRegister(IEnumerable assemblies, bool ignoreDuplicateImplementations, Func registrationPredicate) + public void AutoRegister(IEnumerable assemblies, DuplicateImplementationActions duplicateAction, Func registrationPredicate) { - AutoRegisterInternal(assemblies, ignoreDuplicateImplementations, registrationPredicate); + AutoRegisterInternal(assemblies, duplicateAction, registrationPredicate); } /// @@ -3050,7 +3057,7 @@ namespace TinyIoC #region Internal Methods private readonly object _AutoRegisterLock = new object(); - private void AutoRegisterInternal(IEnumerable assemblies, bool ignoreDuplicateImplementations, Func registrationPredicate) + private void AutoRegisterInternal(IEnumerable assemblies, DuplicateImplementationActions duplicateAction, Func registrationPredicate) { lock (_AutoRegisterLock) { @@ -3083,8 +3090,16 @@ namespace TinyIoC where localType.IsAssignableFrom(implementationType) select implementationType; - if (!ignoreDuplicateImplementations && implementations.Count() > 1) - throw new TinyIoCAutoRegistrationException(type, implementations); + if (implementations.Count() > 1) + { + if (duplicateAction == DuplicateImplementationActions.Fail) + throw new TinyIoCAutoRegistrationException(type, implementations); + + if (duplicateAction == DuplicateImplementationActions.RegisterMultiple) + { + RegisterMultiple(type, implementations); + } + } var firstImplementation = implementations.FirstOrDefault(); if (firstImplementation != null) @@ -3815,6 +3830,7 @@ namespace TinyIoC #endregion } + } // reverse shim for WinRT SR changes... diff --git a/NzbDrone.Host/NzbDrone.Host.csproj b/NzbDrone.Host/NzbDrone.Host.csproj index b17e3b145..a47abc8ed 100644 --- a/NzbDrone.Host/NzbDrone.Host.csproj +++ b/NzbDrone.Host/NzbDrone.Host.csproj @@ -89,12 +89,13 @@ False ..\packages\Microsoft.Owin.Hosting.1.1.0-beta2\lib\net40\Microsoft.Owin.Hosting.dll - - ..\packages\Nancy.0.16.1\lib\net40\Nancy.dll + + False + ..\packages\Nancy.0.18.0\lib\net40\Nancy.dll - + False - ..\packages\Nancy.Owin.0.16.1\lib\net40\Nancy.Owin.dll + ..\packages\Nancy.Owin.0.18.0\lib\net40\Nancy.Owin.dll False diff --git a/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs b/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs index 0cae23f98..54fc516d8 100644 --- a/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs +++ b/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Host.Owin.MiddleWare public void Attach(IAppBuilder appBuilder) { - var nancyOwinHost = new NancyOwinHost(null, _nancyBootstrapper); + var nancyOwinHost = new NancyOwinHost(null, _nancyBootstrapper, new HostConfiguration()); appBuilder.Use((Func, Task>, Func, Task>>)(next => (Func, Task>)nancyOwinHost.Invoke), new object[0]); } } diff --git a/NzbDrone.Host/packages.config b/NzbDrone.Host/packages.config index 71bf70f2c..36d7e82de 100644 --- a/NzbDrone.Host/packages.config +++ b/NzbDrone.Host/packages.config @@ -5,8 +5,8 @@ - - + + diff --git a/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj b/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj index f60085898..a3d18d2b5 100644 --- a/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj +++ b/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj @@ -58,12 +58,13 @@ False ..\packages\Moq.4.0.10827\lib\NET40\Moq.dll - - ..\packages\Nancy.0.16.1\lib\net40\Nancy.dll + + False + ..\packages\Nancy.0.18.0\lib\net40\Nancy.dll - + False - ..\packages\Nancy.Owin.0.16.1\lib\net40\Nancy.Owin.dll + ..\packages\Nancy.Owin.0.18.0\lib\net40\Nancy.Owin.dll False diff --git a/NzbDrone.Integration.Test/packages.config b/NzbDrone.Integration.Test/packages.config index 0f08d34ac..f0ee04f81 100644 --- a/NzbDrone.Integration.Test/packages.config +++ b/NzbDrone.Integration.Test/packages.config @@ -7,8 +7,8 @@ - - + +