diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-24 16:53:54 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-24 16:53:54 -0500 |
| commit | 8ce3e74e8112a94773df22827849bf274fc88198 (patch) | |
| tree | a4ce1edf34466be697e2e432609f6be80b6c6df6 /MediaBrowser.ServerApplication | |
| parent | 6c86721f6de2acbe68e9419064ff21111ff3a223 (diff) | |
More DI
Diffstat (limited to 'MediaBrowser.ServerApplication')
| -rw-r--r-- | MediaBrowser.ServerApplication/App.xaml.cs | 194 | ||||
| -rw-r--r-- | MediaBrowser.ServerApplication/ApplicationHost.cs | 498 | ||||
| -rw-r--r-- | MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.ServerApplication/MainWindow.xaml.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj | 39 | ||||
| -rw-r--r-- | MediaBrowser.ServerApplication/packages.config | 5 |
6 files changed, 540 insertions, 226 deletions
diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs index 1b6b6f98e..5808120ad 100644 --- a/MediaBrowser.ServerApplication/App.xaml.cs +++ b/MediaBrowser.ServerApplication/App.xaml.cs @@ -1,26 +1,13 @@ -using BDInfo; -using MediaBrowser.ClickOnce; -using MediaBrowser.Common.IO; +using MediaBrowser.ClickOnce; +using MediaBrowser.Common.Implementations.Serialization; using MediaBrowser.Common.Kernel; -using MediaBrowser.Common.Net; using MediaBrowser.Controller; -using MediaBrowser.IsoMounter; using MediaBrowser.Logging.Nlog; -using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; -using MediaBrowser.Model.MediaInfo; -using MediaBrowser.Model.Updates; -using MediaBrowser.Networking.Management; -using MediaBrowser.Networking.Udp; -using MediaBrowser.Networking.Web; -using MediaBrowser.Networking.WebSocket; using MediaBrowser.Server.Uninstall; -using MediaBrowser.ServerApplication.Implementations; using Microsoft.Win32; -using SimpleInjector; using System; using System.Diagnostics; -using System.IO; using System.Linq; using System.Net.Cache; using System.Threading; @@ -35,7 +22,7 @@ namespace MediaBrowser.ServerApplication /// <summary> /// Interaction logic for App.xaml /// </summary> - public partial class App : Application, IApplicationHost + public partial class App : Application { /// <summary> /// Defines the entry point of the application. @@ -78,16 +65,11 @@ namespace MediaBrowser.ServerApplication protected ILogger Logger { get; set; } /// <summary> - /// Gets or sets the log file path. + /// Gets or sets the composition root. /// </summary> - /// <value>The log file path.</value> - public string LogFilePath { get; private set; } - - /// <summary> - /// The container - /// </summary> - private Container _container = new Container(); - + /// <value>The composition root.</value> + protected ApplicationHost CompositionRoot { get; set; } + /// <summary> /// Initializes a new instance of the <see cref="App" /> class. /// </summary> @@ -136,12 +118,6 @@ namespace MediaBrowser.ServerApplication } /// <summary> - /// Gets or sets the iso manager. - /// </summary> - /// <value>The iso manager.</value> - private IIsoManager IsoManager { get; set; } - - /// <summary> /// Gets or sets a value indicating whether [last run at startup value]. /// </summary> /// <value><c>null</c> if [last run at startup value] contains no value, <c>true</c> if [last run at startup value]; otherwise, <c>false</c>.</value> @@ -198,13 +174,13 @@ namespace MediaBrowser.ServerApplication /// </summary> protected async void LoadKernel() { - Kernel = new Kernel(this, Logger); + CompositionRoot = new ApplicationHost(Logger); - RegisterResources(); + Kernel = CompositionRoot.Kernel; try { - new MainWindow(Logger).Show(); + new MainWindow(new JsonSerializer(), Logger).Show(); var now = DateTime.UtcNow; @@ -281,6 +257,7 @@ namespace MediaBrowser.ServerApplication base.OnExit(e); Kernel.Dispose(); + CompositionRoot.Dispose(); } /// <summary> @@ -392,17 +369,6 @@ namespace MediaBrowser.ServerApplication } /// <summary> - /// Reloads the logger. - /// </summary> - /// <exception cref="System.NotImplementedException"></exception> - public void ReloadLogger() - { - LogFilePath = Path.Combine(Kernel.ApplicationPaths.LogDirectoryPath, "Server-" + DateTime.Now.Ticks + ".log"); - - NlogManager.AddFileTarget(LogFilePath, Kernel.Configuration.EnableDebugLevelLogging); - } - - /// <summary> /// Gets the image. /// </summary> /// <param name="uri">The URI.</param> @@ -477,143 +443,5 @@ namespace MediaBrowser.ServerApplication RenderOptions.SetBitmapScalingMode(bitmap, BitmapScalingMode.Fant); return bitmap; } - - /// <summary> - /// Gets or sets a value indicating whether this instance can self update. - /// </summary> - /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value> - public bool CanSelfUpdate - { - get { return ClickOnceHelper.IsNetworkDeployed; } - } - - /// <summary> - /// Checks for update. - /// </summary> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="progress">The progress.</param> - /// <returns>Task{CheckForUpdateResult}.</returns> - public Task<CheckForUpdateResult> CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress<double> progress) - { - return new ApplicationUpdateCheck().CheckForApplicationUpdate(cancellationToken, progress); - } - - /// <summary> - /// Updates the application. - /// </summary> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="progress">The progress.</param> - /// <returns>Task.</returns> - public Task UpdateApplication(CancellationToken cancellationToken, IProgress<double> progress) - { - return new ApplicationUpdater().UpdateApplication(cancellationToken, progress); - } - - /// <summary> - /// Registers resources that classes will depend on - /// </summary> - private void RegisterResources() - { - RegisterSingleInstance<IApplicationHost>(this); - RegisterSingleInstance(Logger); - - IsoManager = new PismoIsoManager(Logger); - - RegisterSingleInstance(IsoManager); - RegisterSingleInstance<IBlurayExaminer>(() => new BdInfoExaminer()); - RegisterSingleInstance<INetworkManager>(() => new NetworkManager()); - RegisterSingleInstance<IZipClient>(() => new DotNetZipClient()); - RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger)); - Register(typeof(IUdpServer), typeof(UdpServer)); - RegisterSingleInstance<IHttpServer>(() => new HttpServer(this, Kernel, Logger, "Media Browser", "index.html")); - } - - /// <summary> - /// Creates an instance of type and resolves all constructor dependancies - /// </summary> - /// <param name="type">The type.</param> - /// <returns>System.Object.</returns> - public object CreateInstance(Type type) - { - try - { - return _container.GetInstance(type); - } - catch - { - Logger.Error("Error creating {0}", type.Name); - - throw; - } - } - - /// <summary> - /// Registers the specified obj. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="obj">The obj.</param> - public void RegisterSingleInstance<T>(T obj) - where T : class - { - _container.RegisterSingle(obj); - } - - /// <summary> - /// Registers the specified func. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="func">The func.</param> - public void Register<T>(Func<T> func) - where T : class - { - _container.Register(func); - } - - /// <summary> - /// Registers the single instance. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="func">The func.</param> - public void RegisterSingleInstance<T>(Func<T> func) - where T : class - { - _container.RegisterSingle(func); - } - - /// <summary> - /// Resolves this instance. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns>``0.</returns> - public T Resolve<T>() - { - return (T)_container.GetRegistration(typeof(T), true).GetInstance(); - } - - /// <summary> - /// Resolves this instance. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns>``0.</returns> - public T TryResolve<T>() - { - var result = _container.GetRegistration(typeof(T), false); - - if (result == null) - { - return default(T); - } - return (T)result.GetInstance(); - } - - /// <summary> - /// Registers the specified service type. - /// </summary> - /// <param name="serviceType">Type of the service.</param> - /// <param name="implementation">Type of the concrete.</param> - public void Register(Type serviceType, Type implementation) - { - _container.Register(serviceType, implementation); - } } } diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs new file mode 100644 index 000000000..40e190756 --- /dev/null +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -0,0 +1,498 @@ +using BDInfo; +using MediaBrowser.ClickOnce; +using MediaBrowser.Common.Implementations.ScheduledTasks; +using MediaBrowser.Common.Implementations.Serialization; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Net; +using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Controller; +using MediaBrowser.IsoMounter; +using MediaBrowser.Logging.Nlog; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.MediaInfo; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.System; +using MediaBrowser.Model.Updates; +using MediaBrowser.Networking.Management; +using MediaBrowser.Networking.Udp; +using MediaBrowser.Networking.Web; +using MediaBrowser.Networking.WebSocket; +using MediaBrowser.Server.Implementations; +using MediaBrowser.ServerApplication.Implementations; +using SimpleInjector; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.ServerApplication +{ + /// <summary> + /// Class CompositionRoot + /// </summary> + public class ApplicationHost : IApplicationHost, IDisposable + { + /// <summary> + /// Gets or sets the logger. + /// </summary> + /// <value>The logger.</value> + private ILogger Logger { get; set; } + + /// <summary> + /// Gets or sets the iso manager. + /// </summary> + /// <value>The iso manager.</value> + private IIsoManager IsoManager { get; set; } + + /// <summary> + /// Gets or sets the log file path. + /// </summary> + /// <value>The log file path.</value> + public string LogFilePath { get; private set; } + + /// <summary> + /// The container + /// </summary> + private readonly Container _container = new Container(); + + /// <summary> + /// Gets or sets the kernel. + /// </summary> + /// <value>The kernel.</value> + public Kernel Kernel { get; private set; } + + private readonly List<string> _failedAssemblies = new List<string>(); + /// <summary> + /// Gets assemblies that failed to load + /// </summary> + public IEnumerable<string> FailedAssemblies + { + get { return _failedAssemblies; } + } + + /// <summary> + /// Gets all types within all running assemblies + /// </summary> + /// <value>All types.</value> + public Type[] AllTypes { get; private set; } + + /// <summary> + /// Gets all concrete types. + /// </summary> + /// <value>All concrete types.</value> + public Type[] AllConcreteTypes { get; private set; } + + /// <summary> + /// The disposable parts + /// </summary> + private readonly List<IDisposable> _disposableParts = new List<IDisposable>(); + + /// <summary> + /// The json serializer + /// </summary> + private readonly IJsonSerializer _jsonSerializer = new JsonSerializer(); + + /// <summary> + /// The _XML serializer + /// </summary> + private readonly IXmlSerializer _xmlSerializer = new XmlSerializer(); + + /// <summary> + /// The _application paths + /// </summary> + private readonly IServerApplicationPaths _applicationPaths = new ServerApplicationPaths(); + + /// <summary> + /// The _task manager + /// </summary> + private readonly ITaskManager _taskManager; + + /// <summary> + /// Initializes a new instance of the <see cref="ApplicationHost" /> class. + /// </summary> + /// <param name="logger">The logger.</param> + public ApplicationHost(ILogger logger) + { + Logger = logger; + + _taskManager = new TaskManager(_applicationPaths, _jsonSerializer, Logger); + + Kernel = new Kernel(this, _applicationPaths, _xmlSerializer, _taskManager, Logger); + + RegisterResources(); + + FindParts(); + } + + /// <summary> + /// Registers resources that classes will depend on + /// </summary> + internal void RegisterResources() + { + DiscoverTypes(); + + RegisterSingleInstance<IKernel>(Kernel); + RegisterSingleInstance(Kernel); + + RegisterSingleInstance<IApplicationHost>(this); + RegisterSingleInstance(Logger); + + IsoManager = new PismoIsoManager(Logger); + + RegisterSingleInstance(_applicationPaths); + RegisterSingleInstance<IApplicationPaths>(_applicationPaths); + + RegisterSingleInstance(IsoManager); + RegisterSingleInstance(_taskManager); + RegisterSingleInstance<IBlurayExaminer>(() => new BdInfoExaminer()); + RegisterSingleInstance<INetworkManager>(() => new NetworkManager()); + RegisterSingleInstance<IZipClient>(() => new DotNetZipClient()); + RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger)); + RegisterSingleInstance(_jsonSerializer); + RegisterSingleInstance(_xmlSerializer); + RegisterSingleInstance<IProtobufSerializer>(() => ProtobufSerializer); + Register(typeof(IUdpServer), typeof(UdpServer)); + RegisterSingleInstance(() => ServerFactory.CreateServer(this, Kernel, ProtobufSerializer, Logger, "Media Browser", "index.html")); + } + + /// <summary> + /// Discovers the types. + /// </summary> + private void DiscoverTypes() + { + _failedAssemblies.Clear(); + + AllTypes = GetComposablePartAssemblies().SelectMany(GetTypes).ToArray(); + + AllConcreteTypes = AllTypes.Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType).ToArray(); + } + + /// <summary> + /// Finds the parts. + /// </summary> + private void FindParts() + { + _taskManager.AddTasks(GetExports<IScheduledTask>(false)); + } + + /// <summary> + /// Gets a list of types within an assembly + /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference + /// </summary> + /// <param name="assembly">The assembly.</param> + /// <returns>IEnumerable{Type}.</returns> + /// <exception cref="System.ArgumentNullException">assembly</exception> + private IEnumerable<Type> GetTypes(Assembly assembly) + { + if (assembly == null) + { + throw new ArgumentNullException("assembly"); + } + + try + { + return assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + // If it fails we can still get a list of the Types it was able to resolve + return ex.Types.Where(t => t != null); + } + } + + /// <summary> + /// The _protobuf serializer initialized + /// </summary> + private bool _protobufSerializerInitialized; + /// <summary> + /// The _protobuf serializer sync lock + /// </summary> + private object _protobufSerializerSyncLock = new object(); + /// <summary> + /// Gets a dynamically compiled generated serializer that can serialize protocontracts without reflection + /// </summary> + private ProtobufSerializer _protobufSerializer; + /// <summary> + /// Gets the protobuf serializer. + /// </summary> + /// <value>The protobuf serializer.</value> + public ProtobufSerializer ProtobufSerializer + { + get + { + // Lazy load + LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => ProtobufSerializer.Create(AllTypes)); + return _protobufSerializer; + } + private set + { + _protobufSerializer = value; + _protobufSerializerInitialized = value != null; + } + } + + /// <summary> + /// Creates an instance of type and resolves all constructor dependancies + /// </summary> + /// <param name="type">The type.</param> + /// <returns>System.Object.</returns> + public object CreateInstance(Type type) + { + try + { + return _container.GetInstance(type); + } + catch + { + Logger.Error("Error creating {0}", type.Name); + + throw; + } + } + + /// <summary> + /// Registers the specified obj. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="obj">The obj.</param> + public void RegisterSingleInstance<T>(T obj) + where T : class + { + _container.RegisterSingle(obj); + } + + /// <summary> + /// Registers the specified func. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="func">The func.</param> + public void Register<T>(Func<T> func) + where T : class + { + _container.Register(func); + } + + /// <summary> + /// Registers the single instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="func">The func.</param> + public void RegisterSingleInstance<T>(Func<T> func) + where T : class + { + _container.RegisterSingle(func); + } + + /// <summary> + /// Resolves this instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>``0.</returns> + public T Resolve<T>() + { + return (T)_container.GetRegistration(typeof(T), true).GetInstance(); + } + + /// <summary> + /// Resolves this instance. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>``0.</returns> + public T TryResolve<T>() + { + var result = _container.GetRegistration(typeof(T), false); + + if (result == null) + { + return default(T); + } + return (T)result.GetInstance(); + } + + /// <summary> + /// Registers the specified service type. + /// </summary> + /// <param name="serviceType">Type of the service.</param> + /// <param name="implementation">Type of the concrete.</param> + public void Register(Type serviceType, Type implementation) + { + _container.Register(serviceType, implementation); + } + + /// <summary> + /// Restarts this instance. + /// </summary> + /// <exception cref="System.NotImplementedException"></exception> + public void Restart() + { + App.Instance.Restart(); + } + + /// <summary> + /// Reloads the logger. + /// </summary> + /// <exception cref="System.NotImplementedException"></exception> + public void ReloadLogger() + { + LogFilePath = Path.Combine(Kernel.ApplicationPaths.LogDirectoryPath, "Server-" + DateTime.Now.Ticks + ".log"); + + NlogManager.AddFileTarget(LogFilePath, Kernel.Configuration.EnableDebugLevelLogging); + } + + /// <summary> + /// Gets or sets a value indicating whether this instance can self update. + /// </summary> + /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value> + public bool CanSelfUpdate + { + get { return ClickOnceHelper.IsNetworkDeployed; } + } + + /// <summary> + /// Checks for update. + /// </summary> + /// <param name="cancellationToken">The cancellation token.</param> + /// <param name="progress">The progress.</param> + /// <returns>Task{CheckForUpdateResult}.</returns> + public Task<CheckForUpdateResult> CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress<double> progress) + { + return new ApplicationUpdateCheck().CheckForApplicationUpdate(cancellationToken, progress); + } + + /// <summary> + /// Updates the application. + /// </summary> + /// <param name="cancellationToken">The cancellation token.</param> + /// <param name="progress">The progress.</param> + /// <returns>Task.</returns> + public Task UpdateApplication(CancellationToken cancellationToken, IProgress<double> progress) + { + return new ApplicationUpdater().UpdateApplication(cancellationToken, progress); + } + + /// <summary> + /// Gets the composable part assemblies. + /// </summary> + /// <returns>IEnumerable{Assembly}.</returns> + private IEnumerable<Assembly> GetComposablePartAssemblies() + { + // Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that + // This will prevent the .dll file from getting locked, and allow us to replace it when needed + foreach (var pluginAssembly in Directory + .EnumerateFiles(Kernel.ApplicationPaths.PluginsPath, "*.dll", SearchOption.TopDirectoryOnly) + .Select(LoadAssembly).Where(a => a != null)) + { + yield return pluginAssembly; + } + + var runningDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); + var corePluginDirectory = Path.Combine(runningDirectory, "CorePlugins"); + + // This will prevent the .dll file from getting locked, and allow us to replace it when needed + foreach (var pluginAssembly in Directory + .EnumerateFiles(corePluginDirectory, "*.dll", SearchOption.TopDirectoryOnly) + .Select(LoadAssembly).Where(a => a != null)) + { + yield return pluginAssembly; + } + + // Include composable parts in the Model assembly + yield return typeof(SystemInfo).Assembly; + + // Include composable parts in the Common assembly + yield return typeof(IKernel).Assembly; + + // Include composable parts in the Controller assembly + yield return typeof(Kernel).Assembly; + + // Common implementations + yield return typeof(TaskManager).Assembly; + + // Server implementations + yield return typeof(ServerApplicationPaths).Assembly; + + // Include composable parts in the running assembly + yield return GetType().Assembly; + } + + /// <summary> + /// Loads the assembly. + /// </summary> + /// <param name="file">The file.</param> + /// <returns>Assembly.</returns> + private Assembly LoadAssembly(string file) + { + try + { + return Assembly.Load(File.ReadAllBytes((file))); + } + catch (Exception ex) + { + _failedAssemblies.Add(file); + Logger.ErrorException("Error loading assembly {0}", ex, file); + return null; + } + } + + /// <summary> + /// Gets the exports. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="allTypes">All types.</param> + /// <param name="manageLiftime">if set to <c>true</c> [manage liftime].</param> + /// <returns>IEnumerable{``0}.</returns> + public IEnumerable<T> GetExports<T>(bool manageLiftime = true) + { + var currentType = typeof(T); + + Logger.Info("Composing instances of " + currentType.Name); + + var parts = AllConcreteTypes.Where(currentType.IsAssignableFrom).Select(CreateInstance).Cast<T>().ToArray(); + + if (manageLiftime) + { + _disposableParts.AddRange(parts.OfType<IDisposable>()); + } + + return parts; + } + + /// <summary> + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// </summary> + public void Dispose() + { + Dispose(true); + } + + /// <summary> + /// Releases unmanaged and - optionally - managed resources. + /// </summary> + /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> + protected virtual void Dispose(bool dispose) + { + IsoManager.Dispose(); + + foreach (var part in _disposableParts) + { + part.Dispose(); + } + + _disposableParts.Clear(); + } + } + + public class MyClass + { + public MyClass() + { + + } + } +} diff --git a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs index 02dd6fb9c..59961a941 100644 --- a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs +++ b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs @@ -1,11 +1,12 @@ -using MediaBrowser.Common.Serialization; -using MediaBrowser.Controller; +using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; using System.Globalization; @@ -18,7 +19,6 @@ using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using System.Windows.Media.Imaging; -using MediaBrowser.Model.Logging; namespace MediaBrowser.ServerApplication { @@ -27,8 +27,10 @@ namespace MediaBrowser.ServerApplication /// </summary> public partial class LibraryExplorer : Window { - private ILogger _logger; + private readonly ILogger _logger; + private readonly IJsonSerializer _jsonSerializer; + /// <summary> /// The current user /// </summary> @@ -36,9 +38,10 @@ namespace MediaBrowser.ServerApplication /// <summary> /// Initializes a new instance of the <see cref="LibraryExplorer" /> class. /// </summary> - public LibraryExplorer(ILogger logger) + public LibraryExplorer(IJsonSerializer jsonSerializer, ILogger logger) { _logger = logger; + _jsonSerializer = jsonSerializer; InitializeComponent(); lblVersion.Content = "Version: " + Kernel.Instance.ApplicationVersion; @@ -161,7 +164,7 @@ namespace MediaBrowser.ServerApplication lblIndexBy.Visibility = ddlIndexBy.Visibility = ddlSortBy.Visibility = lblSortBy.Visibility = Visibility.Hidden; } - txtData.Text = FormatJson(JsonSerializer.SerializeToString(item)) + trailers + features; + txtData.Text = FormatJson(_jsonSerializer.SerializeToString(item)) + trailers + features; var previews = new List<PreviewItem>(); await Task.Run(() => diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs index 8a312e7ef..332bb1daa 100644 --- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs +++ b/MediaBrowser.ServerApplication/MainWindow.xaml.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; using MediaBrowser.ServerApplication.Controls; using MediaBrowser.ServerApplication.Logging; using System; @@ -39,6 +40,11 @@ namespace MediaBrowser.ServerApplication private Timer NewItemTimer { get; set; } /// <summary> + /// The _json serializer + /// </summary> + private readonly IJsonSerializer _jsonSerializer; + + /// <summary> /// The _logger /// </summary> private readonly ILogger _logger; @@ -48,13 +54,18 @@ namespace MediaBrowser.ServerApplication /// </summary> /// <param name="logger">The logger.</param> /// <exception cref="System.ArgumentNullException">logger</exception> - public MainWindow(ILogger logger) + public MainWindow(IJsonSerializer jsonSerializer, ILogger logger) { + if (jsonSerializer == null) + { + throw new ArgumentNullException("jsonSerializer"); + } if (logger == null) { throw new ArgumentNullException("logger"); } + _jsonSerializer = jsonSerializer; _logger = logger; InitializeComponent(); @@ -282,7 +293,7 @@ namespace MediaBrowser.ServerApplication /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param> private void cmOpenExplorer_click(object sender, RoutedEventArgs e) { - (new LibraryExplorer(_logger)).Show(); + (new LibraryExplorer(_jsonSerializer, _logger)).Show(); } /// <summary> diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index b1c57949c..8a3a0b7af 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -128,36 +128,6 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\ThirdParty\UPnP\Libs\Platinum.Managed.dll</HintPath> </Reference> - <Reference Include="ServiceStack, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.Common, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Common.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.Interfaces, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Interfaces.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.OrmLite, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.OrmLite.SqlServer"> - <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.SqlServer.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.Redis"> - <HintPath>..\packages\ServiceStack.Redis.3.9.37\lib\net35\ServiceStack.Redis.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.ServiceInterface, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.ServiceInterface.dll</HintPath> - </Reference> - <Reference Include="ServiceStack.Text, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath> - </Reference> <Reference Include="SimpleInjector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll</HintPath> @@ -220,6 +190,7 @@ <DependentUpon>App.xaml</DependentUpon> <SubType>Code</SubType> </Compile> + <Compile Include="ApplicationHost.cs" /> <Compile Include="Controls\ItemUpdateNotification.xaml.cs"> <DependentUpon>ItemUpdateNotification.xaml</DependentUpon> </Compile> @@ -279,6 +250,10 @@ <Project>{cc96bf3e-0bda-4809-bc4b-bb6d418f4a84}</Project> <Name>MediaBrowser.ClickOnce</Name> </ProjectReference> + <ProjectReference Include="..\MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj"> + <Project>{c4d2573a-3fd3-441f-81af-174ac4cd4e1d}</Project> + <Name>MediaBrowser.Common.Implementations</Name> + </ProjectReference> <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj"> <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project> <Name>MediaBrowser.Common</Name> @@ -303,6 +278,10 @@ <Project>{7c11010e-179a-49b7-bfb2-f1656f5e71ad}</Project> <Name>MediaBrowser.Networking</Name> </ProjectReference> + <ProjectReference Include="..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj"> + <Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project> + <Name>MediaBrowser.Server.Implementations</Name> + </ProjectReference> <ProjectReference Include="..\MediaBrowser.Server.Uninstall\MediaBrowser.Server.Uninstall.csproj"> <Project>{5443422f-9548-417a-90dd-2fc91f2b5999}</Project> <Name>MediaBrowser.Server.Uninstall</Name> diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config index 28d6202f8..e1beae6da 100644 --- a/MediaBrowser.ServerApplication/packages.config +++ b/MediaBrowser.ServerApplication/packages.config @@ -3,11 +3,6 @@ <package id="DotNetZip" version="1.9.1.8" targetFramework="net45" /> <package id="Hardcodet.Wpf.TaskbarNotification" version="1.0.4.0" targetFramework="net45" /> <package id="NLog" version="2.0.0.2000" targetFramework="net45" /> - <package id="ServiceStack" version="3.9.37" targetFramework="net45" /> - <package id="ServiceStack.Common" version="3.9.37" targetFramework="net45" /> - <package id="ServiceStack.OrmLite.SqlServer" version="3.9.37" targetFramework="net45" /> - <package id="ServiceStack.Redis" version="3.9.37" targetFramework="net45" /> - <package id="ServiceStack.Text" version="3.9.37" targetFramework="net45" /> <package id="SimpleInjector" version="2.0.0-beta5" targetFramework="net45" /> <package id="System.Data.SQLite" version="1.0.84.0" targetFramework="net45" /> </packages>
\ No newline at end of file |
