Browse Source

Merge pull request #706 from thogil/dependency_modules

Added IDependencyModule to allow plugins to define IoC bindings
Luke 11 years ago
parent
commit
c5f29c67ea

+ 37 - 1
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -35,7 +35,7 @@ namespace MediaBrowser.Common.Implementations
     /// Class BaseApplicationHost
     /// </summary>
     /// <typeparam name="TApplicationPathsType">The type of the T application paths type.</typeparam>
-    public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost
+    public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost, IDependencyContainer
         where TApplicationPathsType : class, IApplicationPaths
     {
         /// <summary>
@@ -406,9 +406,30 @@ namespace MediaBrowser.Common.Implementations
 
                 IsoManager = new IsoManager();
                 RegisterSingleInstance(IsoManager);
+
+                RegisterModules();
             });
         }
 
+        private void RegisterModules()
+        {
+            var moduleTypes = GetExportTypes<IDependencyModule>();
+
+            foreach (var type in moduleTypes)
+            {
+                try
+                {
+                    var instance = Activator.CreateInstance(type) as IDependencyModule;
+                    if (instance != null)
+                        instance.BindDependencies(this);
+                }
+                catch (Exception ex)
+                {
+                    Logger.ErrorException("Error setting up dependency bindings for " + type.Name, ex);
+                }
+            }
+        }
+
         protected virtual IFileSystem CreateFileSystemManager()
         {
             return new CommonFileSystem(Logger, true);
@@ -479,6 +500,11 @@ namespace MediaBrowser.Common.Implementations
             }
         }
 
+        void IDependencyContainer.RegisterSingleInstance<T>(T obj, bool manageLifetime)
+        {
+            RegisterSingleInstance(obj, manageLifetime);
+        }
+
         /// <summary>
         /// Registers the specified obj.
         /// </summary>
@@ -501,6 +527,11 @@ namespace MediaBrowser.Common.Implementations
             }
         }
 
+        void IDependencyContainer.RegisterSingleInstance<T>(Func<T> func)
+        {
+            RegisterSingleInstance(func);
+        }
+
         /// <summary>
         /// Registers the single instance.
         /// </summary>
@@ -512,6 +543,11 @@ namespace MediaBrowser.Common.Implementations
             Container.RegisterSingle(func);
         }
 
+        void IDependencyContainer.Register(Type typeInterface, Type typeImplementation)
+        {
+            Container.Register(typeInterface, typeImplementation);
+        }
+        
         /// <summary>
         /// Resolves this instance.
         /// </summary>

+ 11 - 0
MediaBrowser.Common/IApplicationHost.cs

@@ -152,4 +152,15 @@ namespace MediaBrowser.Common
         /// <returns>System.Object.</returns>
         object CreateInstance(Type type);
     }
+
+    public interface IDependencyContainer
+    {
+        void RegisterSingleInstance<T>(T obj, bool manageLifetime = true)
+            where T : class;
+
+        void RegisterSingleInstance<T>(Func<T> func)
+            where T : class;
+
+        void Register(Type typeInterface, Type typeImplementation);
+    }
 }

+ 1 - 0
MediaBrowser.Common/MediaBrowser.Common.csproj

@@ -79,6 +79,7 @@
     <Compile Include="Net\IWebSocketServer.cs" />
     <Compile Include="Net\MimeTypes.cs" />
     <Compile Include="Net\WebSocketConnectEventArgs.cs" />
+    <Compile Include="Plugins\IDependencyModule.cs" />
     <Compile Include="Plugins\IPlugin.cs" />
     <Compile Include="Progress\ActionableProgress.cs" />
     <Compile Include="ScheduledTasks\IScheduledTask.cs" />

+ 7 - 0
MediaBrowser.Common/Plugins/IDependencyModule.cs

@@ -0,0 +1,7 @@
+namespace MediaBrowser.Common.Plugins
+{
+    public interface IDependencyModule
+    {
+        void BindDependencies(IDependencyContainer container);
+    }
+}