gpt4 book ai didi

c# - WPF-MVVM多项目结构

转载 作者:行者123 更新时间:2023-12-03 10:27:51 28 4
gpt4 key购买 nike

我一直在MVVM中的一个项目中开发应用程序,并在单独的Model,View和ViewModel文件夹中进行开发。通过查看不同的问题和不同的书籍,我了解到由于不同的原因而将它们放在不同的项目中会更好,因此我试图开发一个简单的项目以了解其工作原理。

首先,我创建了一个具有不同文件夹的项目,然后启动了该应用程序,它运行良好。
这就是我省略了Model文件夹的“单个项目”的结构化方式。

在创建由以下3个项目组成的多个项目后:

-MVVM

-MVVM。查看

-MVVM.ViewModels

这就是我构造“多个项目”的方式

我将MVVM.Views,MVVM.ViewModels输出类型设置为Dll而不是.exe,我在MVVM中添加了项目(MVVM.Views,MVVM.ViewModels)引用。

但是当我午餐申请时,我得到了一个错误

An unhandled exception of type 'System.Exception' occurred in WindowsBase.dll Informations: Could not locate any instances of contract MVVM.ViewModels.IShell.



我也将Caliburn.Micro 2.0.2用于bootstrapp,这是MefBootstrapper:
public class MefBootstrapper : BootstrapperBase
{
private CompositionContainer container;

public MefBootstrapper()
{
Initialize();
}

protected override void Configure()
{
var catalog = new AggregateCatalog(
AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
);

container = new CompositionContainer(catalog);

var batch = new CompositionBatch();

batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);

container.Compose(batch);


}

protected override object GetInstance(Type serviceType, string key)
{
string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
var exports = container.GetExportedValues<object>(contract);

if (exports.Count() > 0)
return exports.First();

throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
}

protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
return container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
}

protected override void BuildUp(object instance)
{
container.SatisfyImportsOnce(instance);
}

protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<IShell>();
}
}

这是 ViewModel代码:
namespace MVVM.ViewModels
{
public interface IShell { }

[Export(typeof(IShell))]
public class MainViewModel : PropertyChangedBase, IShell
{

}
}

我想了解我错了什么?我错过了一步?谢谢你的支持

最佳答案

我发布答案,以防万一有人遇到同样的问题。阅读了大量文章和其他内容后,我发现了错误。我忘了将程序集加载到应用程序中。这真的很容易,只需在以下代码中更改Configure() void:

protected override void Configure()
{
string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "");
if (!Directory.Exists(pluginPath))
Directory.CreateDirectory(pluginPath);

var fi = new DirectoryInfo(pluginPath).GetFiles("*.dll");
AssemblySource.Instance.AddRange(fi.Select(fileInfo => Assembly.LoadFrom(fileInfo.FullName)));

var catalog = new AggregateCatalog(
AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
);

container = new CompositionContainer(catalog);

var batch = new CompositionBatch();

batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);

container.Compose(batch);
}

关于c# - WPF-MVVM多项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30077893/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com