Sdílení dat aplikací v různých sestavách

hlasů
0

Mám zcela nové C # / WPF , ale to je to, co jsem použil pro tento projekt.

Dovolte mi představit kontext: Mám aplikaci, která umožňuje uživateli přihlásit. Mám nějaké základní informační data (fyzické umístění) a některé dynamické informace (uživatelské jméno ...). I zabývala se všemi, které s ojedinělým manažerem .

Tato základní aplikace slouží dva různé projekty: po přihlášení, aplikace má zobrazit XAML stránky pro aktuální běžícího projektu.

Některé konfigurace výčtu mi umožňuje instanciate správný objekt z pravé sestavy projektu přes generické rozhraní (myslím, že bych měl mít použití WCF ... uvidíme, že později :)).

Teď potřebuji některé informace, zabývala tím ojedinělým manažerem, v sestavě projektu. Jak mohu udělat ?

Nemohu sdílet Singleton ... Měl bych napsat společnou db? Nebo zbavit Singleton? Jsem trochu ztratil. To je jistě jednoduchá architektura problém, ale nemůžu na to přijít.

Díky moc za vaši pomoc !

Položena 21/11/2011 v 23:51
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Navrhuji použít MEF pro import a export informací z různých DLL. Každá knihovna může mít prostředky (jako je XAML soubory) pro zobrazení poskytuje. Takže, moje volba je MVVM + MEF Modularita + Prism EventAggregator interakce beetwen moduly. Některé vzorky, pouze pro koncepční demonstraci:

Druh ‚ojedinělým manažera‘:

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>
    /// <param name="host">Container to inject in</param>
    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>
    /// <param name="assembly">Assembly to search modules</param>
    /// <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");
        }
    }
}

Modul (DLL pro samostatný projekt) implementace

[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<MenuInitializing>()
            .Subscribe(this.InitializeMenu);

        base.Initialize();
    }
}

Zobrazit jako embeded zdroj (View.xaml) na každé 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}" />
    </DataTemplate>

    <DataTemplate DataType="{x:Type vm:MenuVM}">        
        <ContentPresenter Content="{Binding RibbonData}" />
    </DataTemplate>

</ResourceDictionary>
Odpovězeno 22/11/2011 v 12:54
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more