diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index d3014a2d88..9e570588a8 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -246,12 +246,6 @@ namespace Emby.Server.Implementations
/// The server configuration manager.
public IServerConfigurationManager ServerConfigurationManager => (IServerConfigurationManager)ConfigurationManager;
- ///
- /// Gets or sets the user manager.
- ///
- /// The user manager.
- public IUserManager UserManager { get; set; }
-
public LocalizationManager LocalizationManager { get; set; }
///
@@ -650,7 +644,7 @@ namespace Emby.Server.Implementations
serviceCollection.AddSingleton(new BdInfoExaminer(FileSystemManager));
- UserDataManager = new UserDataManager(LoggerFactory, ServerConfigurationManager, () => UserManager);
+ UserDataManager = new UserDataManager(LoggerFactory, ServerConfigurationManager, Resolve);
serviceCollection.AddSingleton(UserDataManager);
_displayPreferencesRepository = new SqliteDisplayPreferencesRepository(
@@ -664,21 +658,11 @@ namespace Emby.Server.Implementations
AuthenticationRepository = GetAuthenticationRepository();
serviceCollection.AddSingleton(AuthenticationRepository);
- _userRepository = GetUserRepository();
-
- UserManager = new UserManager(
- LoggerFactory.CreateLogger(),
- _userRepository,
- XmlSerializer,
- NetworkManager,
- Resolve,
- Resolve,
- this,
- JsonSerializer,
- FileSystemManager,
- cryptoProvider);
+ serviceCollection.AddSingleton();
- serviceCollection.AddSingleton(UserManager);
+ // TODO: Refactor to eliminate the circular dependency here so that Lazy isn't required
+ serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService));
+ serviceCollection.AddSingleton();
// TODO: Add StartupOptions.FFmpegPath to IConfiguration so this doesn't need to be constructed manually
serviceCollection.AddSingleton(new MediaBrowser.MediaEncoding.Encoder.MediaEncoder(
@@ -771,6 +755,7 @@ namespace Emby.Server.Implementations
_sessionManager = Resolve();
_httpServer = Resolve();
+ ((SqliteUserRepository)Resolve()).Initialize();
((ActivityRepository)Resolve()).Initialize();
_displayPreferencesRepository.Initialize();
@@ -778,11 +763,12 @@ namespace Emby.Server.Implementations
SetStaticProperties();
- ((UserManager)UserManager).Initialize();
+ var userManager = (UserManager)Resolve();
+ userManager.Initialize();
((UserDataManager)UserDataManager).Repository = userDataRepo;
- ((SqliteItemRepository)Resolve()).Initialize(userDataRepo, UserManager);
+ ((SqliteItemRepository)Resolve()).Initialize(userDataRepo, userManager);
FindParts();
}
@@ -853,21 +839,6 @@ namespace Emby.Server.Implementations
}
}
- ///
- /// Gets the user repository.
- ///
- /// .
- private SqliteUserRepository GetUserRepository()
- {
- var repo = new SqliteUserRepository(
- LoggerFactory.CreateLogger(),
- ApplicationPaths);
-
- repo.Initialize();
-
- return repo;
- }
-
private IAuthenticationRepository GetAuthenticationRepository()
{
var repo = new AuthenticationRepository(LoggerFactory, ServerConfigurationManager);
@@ -889,7 +860,7 @@ namespace Emby.Server.Implementations
BaseItem.ProviderManager = Resolve();
BaseItem.LocalizationManager = LocalizationManager;
BaseItem.ItemRepository = Resolve();
- User.UserManager = UserManager;
+ User.UserManager = Resolve();
BaseItem.FileSystem = FileSystemManager;
BaseItem.UserDataManager = UserDataManager;
BaseItem.ChannelManager = Resolve();
@@ -984,7 +955,7 @@ namespace Emby.Server.Implementations
Resolve().AddParts(GetExports());
Resolve().AddParts(GetExports(), GetExports());
- UserManager.AddParts(GetExports(), GetExports());
+ Resolve().AddParts(GetExports(), GetExports());
IsoManager.AddParts(GetExports());
}
diff --git a/Emby.Server.Implementations/Library/UserManager.cs b/Emby.Server.Implementations/Library/UserManager.cs
index 7b17cc913f..64193a8ec2 100644
--- a/Emby.Server.Implementations/Library/UserManager.cs
+++ b/Emby.Server.Implementations/Library/UserManager.cs
@@ -44,22 +44,14 @@ namespace Emby.Server.Implementations.Library
{
private readonly object _policySyncLock = new object();
private readonly object _configSyncLock = new object();
- ///
- /// The logger.
- ///
- private readonly ILogger _logger;
- ///
- /// Gets the active user repository.
- ///
- /// The user repository.
+ private readonly ILogger _logger;
private readonly IUserRepository _userRepository;
private readonly IXmlSerializer _xmlSerializer;
private readonly IJsonSerializer _jsonSerializer;
private readonly INetworkManager _networkManager;
-
- private readonly Func _imageProcessorFactory;
- private readonly Func _dtoServiceFactory;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly Lazy _dtoServiceFactory;
private readonly IServerApplicationHost _appHost;
private readonly IFileSystem _fileSystem;
private readonly ICryptoProvider _cryptoProvider;
@@ -74,13 +66,15 @@ namespace Emby.Server.Implementations.Library
private IPasswordResetProvider[] _passwordResetProviders;
private DefaultPasswordResetProvider _defaultPasswordResetProvider;
+ private IDtoService DtoService => _dtoServiceFactory.Value;
+
public UserManager(
ILogger logger,
IUserRepository userRepository,
IXmlSerializer xmlSerializer,
INetworkManager networkManager,
- Func imageProcessorFactory,
- Func dtoServiceFactory,
+ IImageProcessor imageProcessor,
+ Lazy dtoServiceFactory,
IServerApplicationHost appHost,
IJsonSerializer jsonSerializer,
IFileSystem fileSystem,
@@ -90,7 +84,7 @@ namespace Emby.Server.Implementations.Library
_userRepository = userRepository;
_xmlSerializer = xmlSerializer;
_networkManager = networkManager;
- _imageProcessorFactory = imageProcessorFactory;
+ _imageProcessor = imageProcessor;
_dtoServiceFactory = dtoServiceFactory;
_appHost = appHost;
_jsonSerializer = jsonSerializer;
@@ -600,7 +594,7 @@ namespace Emby.Server.Implementations.Library
try
{
- _dtoServiceFactory().AttachPrimaryImageAspectRatio(dto, user);
+ DtoService.AttachPrimaryImageAspectRatio(dto, user);
}
catch (Exception ex)
{
@@ -625,7 +619,7 @@ namespace Emby.Server.Implementations.Library
{
try
{
- return _imageProcessorFactory().GetImageCacheTag(item, image);
+ return _imageProcessor.GetImageCacheTag(item, image);
}
catch (Exception ex)
{