Совместное использование данных приложений в разных сборках

Я новичок в С#/WPF, но это то, что я использовал для этого проекта.

Позвольте мне представить контекст: у меня есть приложение, которое позволяет пользователю войти в систему. У меня есть некоторые основные информационные данные (физическое местоположение) и некоторая динамическая информация (имя пользователя...). Я справился со всем этим с одним менеджером.

Это основное приложение используется с двумя разными проектами: после входа в систему приложение должно отображать страницы xaml для текущего запущенного проекта.

Некоторая конфигурация enum позволяет мне инициировать правильный объект из правой сборки проекта через общий интерфейс (я думаю, я должен использовать WCF... мы увидим это позже :)).

Теперь мне нужна часть информации, которую управляет синглтон, в сборке проекта. Как я могу сделать?

Я не могу разделить синглтон... Должен ли я писать общий дБ? Или избавиться от синглтона? Я немного потерян. Это, безусловно, простая проблема архитектуры, но я не могу понять это.

Большое спасибо за вашу помощь !

1 ответ

Я предлагаю вам использовать MEF для импорта и экспорта информации из разных DLL. Каждая DLL может иметь ресурсы (например, файлы XAML) для представления. Таким образом, мой выбор - это MVVM + MEF модульность + Prism EventAggregator для взаимодействия с модулями. Некоторые образцы, только для демонстрации концепции:

Вид "singleton manager":

public class AddinsManager : IAddinsManager
{
 [ImportMany(typeof(IModule))]
 private OrderingCollection<imodule, iordermetadata=""> modules = new OrderingCollection<imodule, iordermetadata="">(lazyRule => lazyRule.Metadata.Order);

 private CompositionContainer container;
 private bool isInitialized = false;

 /// <summary>
 /// Gets available application modules (add-ins)
 /// </summary>
 public List<imodule> Modules { get; private set; }

 /// <summary>
 /// Initialize manager
 /// </summary>
 public void Initialize()
 {
 Assembly oAssembly = Assembly.GetAssembly(Application.Current.GetType());
 this.container = new CompositionContainer(GetCatalog(oAssembly));
 this.container.ComposeParts(this, Context.Current);

 this.Modules = this.modules
 .Select(lazy => lazy.Value)
 .ToList();

 this.isInitialized = true;
 }

 /// <summary>
 /// Initialize modules
 /// </summary>
 public void InitializeModules()
 {
 foreach (IModule oModule in this.Modules)
 {
 oModule.Initialize();
 }
 }

 /// <summary>
 /// Injects dependencies in specified container
 /// </summary>
 /// Container to inject in
 public void Compose(object host)
 {
 if (host == null)
 {
 throw new ArgumentNullException();
 }

 this.EnsureInitialize();

 this.container.ComposeParts(host);
 }

 /// <summary>
 /// Register views of the modules
 /// </summary>
 public void RegisterViews()
 {
 this.EnsureInitialize();

 foreach (IModule oModule in this.Modules)
 {
 foreach (Uri oUri in oModule.GetViewPath().ToArray())
 {
 ResourceDictionary oDictionary = new ResourceDictionary();
 oDictionary.Source = oUri;
 Application.Current.Resources.MergedDictionaries.Add(oDictionary);
 }
 }
 }

 /// <summary>
 /// Get catalog for modules load
 /// </summary>
 /// Assembly to search modules
 /// <returns>Catalog for modules load</returns>
 private static AggregateCatalog GetCatalog(Assembly assembly)
 {
 string sDirName = Path.GetDirectoryName(assembly.Location);
 DirectoryCatalog oDirCatalog = new DirectoryCatalog(sDirName, "Company.*");
 AssemblyCatalog oAssemblyCatalog = new AssemblyCatalog(assembly);

 AggregateCatalog oCatalog = new AggregateCatalog(oAssemblyCatalog, oDirCatalog);
 return oCatalog;
 }

 /// <summary>
 /// Ensure if manager was initialized
 /// </summary>
 private void EnsureInitialize()
 {
 if (!this.isInitialized)
 {
 throw new Exception("Add-ins Manager Component not initialized");
 }
 }
}
</imodule></imodule,></imodule,>

Реализация модуля (DLL для отдельного проекта)

[Export(typeof(IModule))]
public class LayoutsModule : AModule
{
 private static LayoutsVM viewModel;

 /// <summary>
 /// Gets reporting add-in main view model
 /// </summary>
 public static LayoutsVM ViewModel
 {
 get
 {
 if (viewModel == null)
 {
 viewModel = Context
 .Current
 .LayoutManager
 .ModulesVM
 .OfType<layoutsvm>()
 .FirstOrDefault();
 }

 return viewModel;
 }
 }

 /// <summary>
 /// Initialize module
 /// </summary>
 public override void Initialize()
 {
 Context
 .Current
 .EventAggregator
 .GetEvent<****************>()
 .Subscribe(this.InitializeMenu);

 base.Initialize();
 }
}
</****************></layoutsvm>

Просмотр как встроенный ресурс (View.xaml) для каждой библиотеки DLL.

<resourcedictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:Company.Client.ViewModels">

 <datatemplate datatype="{x:Type vm:ApplicationVM}">
 <contentpresenter content="{Binding AddinsViewModel}">
 </contentpresenter></datatemplate>

 <datatemplate datatype="{x:Type vm:MenuVM}"> 
 <contentpresenter content="{Binding RibbonData}">
 </contentpresenter></datatemplate>

</resourcedictionary>

licensed under cc by-sa 3.0 with attribution.