From 8ce3e74e8112a94773df22827849bf274fc88198 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Sun, 24 Feb 2013 16:53:54 -0500 Subject: More DI --- MediaBrowser.ServerApplication/App.xaml.cs | 194 +------- MediaBrowser.ServerApplication/ApplicationHost.cs | 498 +++++++++++++++++++++ .../LibraryExplorer.xaml.cs | 15 +- MediaBrowser.ServerApplication/MainWindow.xaml.cs | 15 +- .../MediaBrowser.ServerApplication.csproj | 39 +- MediaBrowser.ServerApplication/packages.config | 5 - 6 files changed, 540 insertions(+), 226 deletions(-) create mode 100644 MediaBrowser.ServerApplication/ApplicationHost.cs (limited to 'MediaBrowser.ServerApplication') 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 /// /// Interaction logic for App.xaml /// - public partial class App : Application, IApplicationHost + public partial class App : Application { /// /// Defines the entry point of the application. @@ -78,16 +65,11 @@ namespace MediaBrowser.ServerApplication protected ILogger Logger { get; set; } /// - /// Gets or sets the log file path. + /// Gets or sets the composition root. /// - /// The log file path. - public string LogFilePath { get; private set; } - - /// - /// The container - /// - private Container _container = new Container(); - + /// The composition root. + protected ApplicationHost CompositionRoot { get; set; } + /// /// Initializes a new instance of the class. /// @@ -135,12 +117,6 @@ namespace MediaBrowser.ServerApplication get { return "MediaBrowser.Server.Uninstall.exe"; } } - /// - /// Gets or sets the iso manager. - /// - /// The iso manager. - private IIsoManager IsoManager { get; set; } - /// /// Gets or sets a value indicating whether [last run at startup value]. /// @@ -198,13 +174,13 @@ namespace MediaBrowser.ServerApplication /// 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(); } /// @@ -391,17 +368,6 @@ namespace MediaBrowser.ServerApplication Dispatcher.Invoke(Shutdown); } - /// - /// Reloads the logger. - /// - /// - public void ReloadLogger() - { - LogFilePath = Path.Combine(Kernel.ApplicationPaths.LogDirectoryPath, "Server-" + DateTime.Now.Ticks + ".log"); - - NlogManager.AddFileTarget(LogFilePath, Kernel.Configuration.EnableDebugLevelLogging); - } - /// /// Gets the image. /// @@ -477,143 +443,5 @@ namespace MediaBrowser.ServerApplication RenderOptions.SetBitmapScalingMode(bitmap, BitmapScalingMode.Fant); return bitmap; } - - /// - /// Gets or sets a value indicating whether this instance can self update. - /// - /// true if this instance can self update; otherwise, false. - public bool CanSelfUpdate - { - get { return ClickOnceHelper.IsNetworkDeployed; } - } - - /// - /// Checks for update. - /// - /// The cancellation token. - /// The progress. - /// Task{CheckForUpdateResult}. - public Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress) - { - return new ApplicationUpdateCheck().CheckForApplicationUpdate(cancellationToken, progress); - } - - /// - /// Updates the application. - /// - /// The cancellation token. - /// The progress. - /// Task. - public Task UpdateApplication(CancellationToken cancellationToken, IProgress progress) - { - return new ApplicationUpdater().UpdateApplication(cancellationToken, progress); - } - - /// - /// Registers resources that classes will depend on - /// - private void RegisterResources() - { - RegisterSingleInstance(this); - RegisterSingleInstance(Logger); - - IsoManager = new PismoIsoManager(Logger); - - RegisterSingleInstance(IsoManager); - RegisterSingleInstance(() => new BdInfoExaminer()); - RegisterSingleInstance(() => new NetworkManager()); - RegisterSingleInstance(() => new DotNetZipClient()); - RegisterSingleInstance(() => new AlchemyServer(Logger)); - Register(typeof(IUdpServer), typeof(UdpServer)); - RegisterSingleInstance(() => new HttpServer(this, Kernel, Logger, "Media Browser", "index.html")); - } - - /// - /// Creates an instance of type and resolves all constructor dependancies - /// - /// The type. - /// System.Object. - public object CreateInstance(Type type) - { - try - { - return _container.GetInstance(type); - } - catch - { - Logger.Error("Error creating {0}", type.Name); - - throw; - } - } - - /// - /// Registers the specified obj. - /// - /// - /// The obj. - public void RegisterSingleInstance(T obj) - where T : class - { - _container.RegisterSingle(obj); - } - - /// - /// Registers the specified func. - /// - /// - /// The func. - public void Register(Func func) - where T : class - { - _container.Register(func); - } - - /// - /// Registers the single instance. - /// - /// - /// The func. - public void RegisterSingleInstance(Func func) - where T : class - { - _container.RegisterSingle(func); - } - - /// - /// Resolves this instance. - /// - /// - /// ``0. - public T Resolve() - { - return (T)_container.GetRegistration(typeof(T), true).GetInstance(); - } - - /// - /// Resolves this instance. - /// - /// - /// ``0. - public T TryResolve() - { - var result = _container.GetRegistration(typeof(T), false); - - if (result == null) - { - return default(T); - } - return (T)result.GetInstance(); - } - - /// - /// Registers the specified service type. - /// - /// Type of the service. - /// Type of the concrete. - 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 +{ + /// + /// Class CompositionRoot + /// + public class ApplicationHost : IApplicationHost, IDisposable + { + /// + /// Gets or sets the logger. + /// + /// The logger. + private ILogger Logger { get; set; } + + /// + /// Gets or sets the iso manager. + /// + /// The iso manager. + private IIsoManager IsoManager { get; set; } + + /// + /// Gets or sets the log file path. + /// + /// The log file path. + public string LogFilePath { get; private set; } + + /// + /// The container + /// + private readonly Container _container = new Container(); + + /// + /// Gets or sets the kernel. + /// + /// The kernel. + public Kernel Kernel { get; private set; } + + private readonly List _failedAssemblies = new List(); + /// + /// Gets assemblies that failed to load + /// + public IEnumerable FailedAssemblies + { + get { return _failedAssemblies; } + } + + /// + /// Gets all types within all running assemblies + /// + /// All types. + public Type[] AllTypes { get; private set; } + + /// + /// Gets all concrete types. + /// + /// All concrete types. + public Type[] AllConcreteTypes { get; private set; } + + /// + /// The disposable parts + /// + private readonly List _disposableParts = new List(); + + /// + /// The json serializer + /// + private readonly IJsonSerializer _jsonSerializer = new JsonSerializer(); + + /// + /// The _XML serializer + /// + private readonly IXmlSerializer _xmlSerializer = new XmlSerializer(); + + /// + /// The _application paths + /// + private readonly IServerApplicationPaths _applicationPaths = new ServerApplicationPaths(); + + /// + /// The _task manager + /// + private readonly ITaskManager _taskManager; + + /// + /// Initializes a new instance of the class. + /// + /// The logger. + public ApplicationHost(ILogger logger) + { + Logger = logger; + + _taskManager = new TaskManager(_applicationPaths, _jsonSerializer, Logger); + + Kernel = new Kernel(this, _applicationPaths, _xmlSerializer, _taskManager, Logger); + + RegisterResources(); + + FindParts(); + } + + /// + /// Registers resources that classes will depend on + /// + internal void RegisterResources() + { + DiscoverTypes(); + + RegisterSingleInstance(Kernel); + RegisterSingleInstance(Kernel); + + RegisterSingleInstance(this); + RegisterSingleInstance(Logger); + + IsoManager = new PismoIsoManager(Logger); + + RegisterSingleInstance(_applicationPaths); + RegisterSingleInstance(_applicationPaths); + + RegisterSingleInstance(IsoManager); + RegisterSingleInstance(_taskManager); + RegisterSingleInstance(() => new BdInfoExaminer()); + RegisterSingleInstance(() => new NetworkManager()); + RegisterSingleInstance(() => new DotNetZipClient()); + RegisterSingleInstance(() => new AlchemyServer(Logger)); + RegisterSingleInstance(_jsonSerializer); + RegisterSingleInstance(_xmlSerializer); + RegisterSingleInstance(() => ProtobufSerializer); + Register(typeof(IUdpServer), typeof(UdpServer)); + RegisterSingleInstance(() => ServerFactory.CreateServer(this, Kernel, ProtobufSerializer, Logger, "Media Browser", "index.html")); + } + + /// + /// Discovers the types. + /// + private void DiscoverTypes() + { + _failedAssemblies.Clear(); + + AllTypes = GetComposablePartAssemblies().SelectMany(GetTypes).ToArray(); + + AllConcreteTypes = AllTypes.Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType).ToArray(); + } + + /// + /// Finds the parts. + /// + private void FindParts() + { + _taskManager.AddTasks(GetExports(false)); + } + + /// + /// 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 + /// + /// The assembly. + /// IEnumerable{Type}. + /// assembly + private IEnumerable 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); + } + } + + /// + /// The _protobuf serializer initialized + /// + private bool _protobufSerializerInitialized; + /// + /// The _protobuf serializer sync lock + /// + private object _protobufSerializerSyncLock = new object(); + /// + /// Gets a dynamically compiled generated serializer that can serialize protocontracts without reflection + /// + private ProtobufSerializer _protobufSerializer; + /// + /// Gets the protobuf serializer. + /// + /// The protobuf serializer. + 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; + } + } + + /// + /// Creates an instance of type and resolves all constructor dependancies + /// + /// The type. + /// System.Object. + public object CreateInstance(Type type) + { + try + { + return _container.GetInstance(type); + } + catch + { + Logger.Error("Error creating {0}", type.Name); + + throw; + } + } + + /// + /// Registers the specified obj. + /// + /// + /// The obj. + public void RegisterSingleInstance(T obj) + where T : class + { + _container.RegisterSingle(obj); + } + + /// + /// Registers the specified func. + /// + /// + /// The func. + public void Register(Func func) + where T : class + { + _container.Register(func); + } + + /// + /// Registers the single instance. + /// + /// + /// The func. + public void RegisterSingleInstance(Func func) + where T : class + { + _container.RegisterSingle(func); + } + + /// + /// Resolves this instance. + /// + /// + /// ``0. + public T Resolve() + { + return (T)_container.GetRegistration(typeof(T), true).GetInstance(); + } + + /// + /// Resolves this instance. + /// + /// + /// ``0. + public T TryResolve() + { + var result = _container.GetRegistration(typeof(T), false); + + if (result == null) + { + return default(T); + } + return (T)result.GetInstance(); + } + + /// + /// Registers the specified service type. + /// + /// Type of the service. + /// Type of the concrete. + public void Register(Type serviceType, Type implementation) + { + _container.Register(serviceType, implementation); + } + + /// + /// Restarts this instance. + /// + /// + public void Restart() + { + App.Instance.Restart(); + } + + /// + /// Reloads the logger. + /// + /// + public void ReloadLogger() + { + LogFilePath = Path.Combine(Kernel.ApplicationPaths.LogDirectoryPath, "Server-" + DateTime.Now.Ticks + ".log"); + + NlogManager.AddFileTarget(LogFilePath, Kernel.Configuration.EnableDebugLevelLogging); + } + + /// + /// Gets or sets a value indicating whether this instance can self update. + /// + /// true if this instance can self update; otherwise, false. + public bool CanSelfUpdate + { + get { return ClickOnceHelper.IsNetworkDeployed; } + } + + /// + /// Checks for update. + /// + /// The cancellation token. + /// The progress. + /// Task{CheckForUpdateResult}. + public Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress) + { + return new ApplicationUpdateCheck().CheckForApplicationUpdate(cancellationToken, progress); + } + + /// + /// Updates the application. + /// + /// The cancellation token. + /// The progress. + /// Task. + public Task UpdateApplication(CancellationToken cancellationToken, IProgress progress) + { + return new ApplicationUpdater().UpdateApplication(cancellationToken, progress); + } + + /// + /// Gets the composable part assemblies. + /// + /// IEnumerable{Assembly}. + private IEnumerable 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; + } + + /// + /// Loads the assembly. + /// + /// The file. + /// Assembly. + 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; + } + } + + /// + /// Gets the exports. + /// + /// + /// All types. + /// if set to true [manage liftime]. + /// IEnumerable{``0}. + public IEnumerable GetExports(bool manageLiftime = true) + { + var currentType = typeof(T); + + Logger.Info("Composing instances of " + currentType.Name); + + var parts = AllConcreteTypes.Where(currentType.IsAssignableFrom).Select(CreateInstance).Cast().ToArray(); + + if (manageLiftime) + { + _disposableParts.AddRange(parts.OfType()); + } + + return parts; + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + 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 /// public partial class LibraryExplorer : Window { - private ILogger _logger; + private readonly ILogger _logger; + private readonly IJsonSerializer _jsonSerializer; + /// /// The current user /// @@ -36,9 +38,10 @@ namespace MediaBrowser.ServerApplication /// /// Initializes a new instance of the class. /// - 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(); 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; @@ -38,6 +39,11 @@ namespace MediaBrowser.ServerApplication /// The new item timer. private Timer NewItemTimer { get; set; } + /// + /// The _json serializer + /// + private readonly IJsonSerializer _jsonSerializer; + /// /// The _logger /// @@ -48,13 +54,18 @@ namespace MediaBrowser.ServerApplication /// /// The logger. /// logger - 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 /// The instance containing the event data. private void cmOpenExplorer_click(object sender, RoutedEventArgs e) { - (new LibraryExplorer(_logger)).Show(); + (new LibraryExplorer(_jsonSerializer, _logger)).Show(); } /// 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 @@ False ..\ThirdParty\UPnP\Libs\Platinum.Managed.dll - - False - ..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.dll - - - False - ..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Common.dll - - - False - ..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Interfaces.dll - - - False - ..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.dll - - - ..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.SqlServer.dll - - - ..\packages\ServiceStack.Redis.3.9.37\lib\net35\ServiceStack.Redis.dll - - - False - ..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.ServiceInterface.dll - - - False - ..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll - False ..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll @@ -220,6 +190,7 @@ App.xaml Code + ItemUpdateNotification.xaml @@ -279,6 +250,10 @@ {cc96bf3e-0bda-4809-bc4b-bb6d418f4a84} MediaBrowser.ClickOnce + + {c4d2573a-3fd3-441f-81af-174ac4cd4e1d} + MediaBrowser.Common.Implementations + {9142eefa-7570-41e1-bfcc-468bb571af2f} MediaBrowser.Common @@ -303,6 +278,10 @@ {7c11010e-179a-49b7-bfb2-f1656f5e71ad} MediaBrowser.Networking + + {2e781478-814d-4a48-9d80-bff206441a65} + MediaBrowser.Server.Implementations + {5443422f-9548-417a-90dd-2fc91f2b5999} MediaBrowser.Server.Uninstall 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 @@ - - - - - \ No newline at end of file -- cgit v1.2.3