diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index 18b6834ef5..f10ebdd01e 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -351,6 +351,42 @@ namespace Emby.Server.Implementations
public object CreateInstance(Type type)
=> ActivatorUtilities.CreateInstance(ServiceProvider, type);
+ ///
+ /// Creates an instance of type and resolves all constructor dependencies.
+ ///
+ /// The type.
+ /// Additional argument for the constructor.
+ ///
+ public object CreateInstance(Type type, object parameter)
+ {
+ ConstructorInfo constructor = type.GetConstructors()[0];
+ if (constructor != null)
+ {
+ ParameterInfo[] argInfo = constructor
+ .GetParameters();
+
+ object[] args = argInfo
+ .Select(o => o.ParameterType)
+ .Select(o => ServiceProvider.GetService(o))
+ .ToArray();
+
+ if (parameter != null)
+ {
+ // Assumption is that the is always the last in the constructor's parameter list.
+ int argsLen = args.Length;
+ var argType = argInfo[argsLen - 1].ParameterType;
+ var paramType = parameter.GetType();
+ if (argType.IsAssignableFrom(paramType) || argType == paramType)
+ {
+ args[argsLen - 1] = parameter;
+ return ActivatorUtilities.CreateInstance(ServiceProvider, type, args);
+ }
+ }
+ }
+
+ return ActivatorUtilities.CreateInstance(ServiceProvider, type);
+ }
+
///
/// Creates an instance of type and resolves all constructor dependencies.
///
@@ -566,8 +602,10 @@ namespace Emby.Server.Implementations
serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService));
// TODO: Refactor to eliminate the circular dependency here so that Lazy isn't required
+ // TODO: Add StartupOptions.FFmpegPath to IConfiguration and remove this custom activation
serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService));
- serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton(provider =>
+ ActivatorUtilities.CreateInstance(provider, _startupOptions.FFmpegPath ?? string.Empty));
// TODO: Refactor to eliminate the circular dependencies here so that Lazy isn't required
serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService));
diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
index c3428ee62a..6860b7ecdf 100644
--- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -107,6 +107,11 @@ namespace Emby.Server.Implementations.HttpServer
return _appHost.CreateInstance(type);
}
+ public object CreateInstance(Type type, object parameter)
+ {
+ return _appHost.CreateInstance(type, parameter);
+ }
+
private static string NormalizeUrlPath(string path)
{
if (path.Length > 0 && path[0] == '/')
diff --git a/Emby.Server.Implementations/Services/ServiceController.cs b/Emby.Server.Implementations/Services/ServiceController.cs
index 857df591a1..2a780feb58 100644
--- a/Emby.Server.Implementations/Services/ServiceController.cs
+++ b/Emby.Server.Implementations/Services/ServiceController.cs
@@ -177,8 +177,8 @@ namespace Emby.Server.Implementations.Services
var serviceType = httpHost.GetServiceTypeByRequest(requestType);
- var service = httpHost.CreateInstance(serviceType);
-
+ var service = httpHost.CreateInstance(serviceType, req);
+
var serviceRequiresContext = service as IRequiresRequest;
if (serviceRequiresContext != null)
{
diff --git a/MediaBrowser.Common/IApplicationHost.cs b/MediaBrowser.Common/IApplicationHost.cs
index e8d9282e40..cf4954eef1 100644
--- a/MediaBrowser.Common/IApplicationHost.cs
+++ b/MediaBrowser.Common/IApplicationHost.cs
@@ -125,5 +125,13 @@ namespace MediaBrowser.Common
/// The type.
/// System.Object.
object CreateInstance(Type type);
+
+ ///
+ /// Creates a new instance of a class.
+ ///
+ /// The type to create.
+ /// An addtional parameter.
+ /// Created instance.
+ object CreateInstance(Type type, object parameter);
}
}