public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer,
                      IPlaylistManager playlistManager,
                      ILibraryManager libraryManager,
                      ILogger logger, IUserManager userManager, IJsonSerializer jsonSerializer,
                      IServerApplicationPaths serverApplicationPaths, ISessionManager sessionManager)
            : base(applicationPaths, xmlSerializer)
        {
            _logger         = logger;
            _sessionManager = sessionManager;
            Instance        = this;
            var smartPlaylistFileSystem =
                new EnsureBaseDirSmartPlaylistFileSystemDecorator(new SmartPlaylistFileSystem(serverApplicationPaths));
            var smartPlaylistStore = new SmartPlaylistStorePerfLoggerDecorator(new CacheableSmartPlaylistStore(
                                                                                   new CleanupOldCriteriaDecorator(new SmartPlaylistStore(jsonSerializer, smartPlaylistFileSystem))));
            var userItemsProvider     = new UserItemsProviderPerfLoggerDecorator(new UserItemsProvider(libraryManager));
            var smartPlaylistProvider =
                new SmartPlaylistProviderPerfLoggerDecorator(new SmartPlaylistProvider(smartPlaylistStore));
            var playlistRepository =
                new PlaylistRepositoryPerfLoggerDecorator(new PlaylistRepository(userManager, libraryManager));
            var playlistItemsUpdater =
                new PlaylistItemsUpdaterPerfLoggerDecorator(new PlaylistItemsUpdater(playlistManager));

            MessageBus = new MessageBus();

            SubscribeMessageHandlers(smartPlaylistProvider, userItemsProvider, playlistRepository,
                                     playlistItemsUpdater, smartPlaylistStore);

            SmartPlaylistStore     = smartPlaylistStore;
            SmartPlaylistValidator = new SmartPlaylistValidator();

            Logger.Instance = new Logger(logger);
        }
        public SmartPlaylistApi(ISessionContext sessionContext
                                )
        {
            _sessionContext = sessionContext;

            _messageBus             = Plugin.Instance.MessageBus;
            _smartPlaylistStore     = Plugin.Instance.SmartPlaylistStore;
            _smartPlaylistValidator = Plugin.Instance.SmartPlaylistValidator;
        }