From 2b41623f6d75acf6301f689db31570888c8abb3e Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 2 Sep 2018 14:18:13 -0500 Subject: Use generics in WixToolsetServiceProvider to make the compiler help with the type checking. --- src/WixToolset.Core/WixToolsetServiceProvider.cs | 57 +++++++++++++----------- 1 file changed, 31 insertions(+), 26 deletions(-) (limited to 'src/WixToolset.Core') diff --git a/src/WixToolset.Core/WixToolsetServiceProvider.cs b/src/WixToolset.Core/WixToolsetServiceProvider.cs index 9278ddc3..f4a9f78d 100644 --- a/src/WixToolset.Core/WixToolsetServiceProvider.cs +++ b/src/WixToolset.Core/WixToolsetServiceProvider.cs @@ -14,34 +14,32 @@ namespace WixToolset.Core { public WixToolsetServiceProvider() { - this.CreationFunctions = new Dictionary, object>> - { + this.CreationFunctions = new Dictionary, object>>(); + this.Singletons = new Dictionary(); + // Singletons. - { typeof(IExtensionManager), (provider, singletons) => AddSingleton(singletons, typeof(IExtensionManager), new ExtensionManager()) }, - { typeof(IMessaging), (provider, singletons) => AddSingleton(singletons, typeof(IMessaging), new Messaging()) }, - { typeof(ITupleDefinitionCreator), (provider, singletons) => AddSingleton(singletons, typeof(ITupleDefinitionCreator), new TupleDefinitionCreator(provider)) }, - { typeof(IParseHelper), (provider, singletons) => AddSingleton(singletons, typeof(IParseHelper), new ParseHelper(provider)) }, - { typeof(IPreprocessHelper), (provider, singletons) => AddSingleton(singletons, typeof(IPreprocessHelper), new PreprocessHelper(provider)) }, - { typeof(IBackendHelper), (provider, singletons) => AddSingleton(singletons, typeof(IBackendHelper), new BackendHelper(provider)) }, - { typeof(IWindowsInstallerBackendHelper), (provider, singletons) => AddSingleton(singletons, typeof(IWindowsInstallerBackendHelper), new WindowsInstallerBackendHelper(provider)) }, + this.AddService((provider, singletons) => AddSingleton(singletons, new ExtensionManager())); + this.AddService((provider, singletons) => AddSingleton(singletons, new Messaging())); + this.AddService((provider, singletons) => AddSingleton(singletons, new TupleDefinitionCreator(provider))); + this.AddService((provider, singletons) => AddSingleton(singletons, new ParseHelper(provider))); + this.AddService((provider, singletons) => AddSingleton(singletons, new PreprocessHelper(provider))); + this.AddService((provider, singletons) => AddSingleton(singletons, new BackendHelper(provider))); + this.AddService((provider, singletons) => AddSingleton(singletons, new WindowsInstallerBackendHelper(provider))); // Transients. - { typeof(ICommandLineArguments), (provider, singletons) => new CommandLineArguments(provider) }, - { typeof(ICommandLineContext), (provider, singletons) => new CommandLineContext(provider) }, - { typeof(ICommandLineParser), (provider, singletons) => new CommandLineParser(provider) }, - { typeof(IPreprocessContext), (provider, singletons) => new PreprocessContext(provider) }, - { typeof(ICompileContext), (provider, singletons) => new CompileContext(provider) }, - { typeof(ILinkContext), (provider, singletons) => new LinkContext(provider) }, - { typeof(IResolveContext), (provider, singletons) => new ResolveContext(provider) }, - { typeof(IBindContext), (provider, singletons) => new BindContext(provider) }, - { typeof(ILayoutContext), (provider, singletons) => new LayoutContext(provider) }, - { typeof(IInscribeContext), (provider, singletons) => new InscribeContext(provider) }, - - // Internal implementations. - { typeof(ILocalizer), (provider, singletons) => new Localizer(provider) }, - }; + this.AddService((provider, singletons) => new CommandLineArguments(provider)); + this.AddService((provider, singletons) => new CommandLineContext(provider)); + this.AddService((provider, singletons) => new CommandLineParser(provider)); + this.AddService((provider, singletons) => new PreprocessContext(provider)); + this.AddService((provider, singletons) => new CompileContext(provider)); + this.AddService((provider, singletons) => new LinkContext(provider)); + this.AddService((provider, singletons) => new ResolveContext(provider)); + this.AddService((provider, singletons) => new BindContext(provider)); + this.AddService((provider, singletons) => new LayoutContext(provider)); + this.AddService((provider, singletons) => new InscribeContext(provider)); - this.Singletons = new Dictionary(); + // Internal implementations. + this.AddService((provider, singletons) => new Localizer(provider)); } private Dictionary, object>> CreationFunctions { get; } @@ -80,9 +78,16 @@ namespace WixToolset.Core this.CreationFunctions[serviceType] = creationFunction; } - private static object AddSingleton(Dictionary singletons, Type type, object service) + public void AddService(Func, T> creationFunction) + where T : class + { + AddService(typeof(T), creationFunction); + } + + private static T AddSingleton(Dictionary singletons, T service) + where T : class { - singletons.Add(type, service); + singletons.Add(typeof(T), service); return service; } } -- cgit v1.2.3-55-g6feb