gpt4 book ai didi

c# - WCF 服务中的 Prism 模块系统?

转载 作者:太空狗 更新时间:2023-10-29 20:31:00 26 4
gpt4 key购买 nike

你能从 WCF 服务中引导一个 Prism 模块系统吗?因为无论我做什么,我的 MEF 依赖项都没有得到满足。

例如:

这是我的WCF 服务实现

public class MyService : IMyServiceContract{
// This should get filled by MEF after Prism loads the required modules
[Import]
IDatabase db;

public MyService(){
var bootsrapper = new MyServiceBoostrapper();
bootsrapper.Run();
}
}

这是我的带有 MEF 风格的 Prism boostrapper:

public class MyServiceBoostrapper : MefBootstrapper
{
protected override void ConfigureContainer()
{
base.ConfigureContainer();
}

protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();

// TODO: Add this assembly ... don't know why
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyServiceBoostrapper).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(IDatabase).Assembly));
// This is what provides the service
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(DatabaseImpl).Assembly));
}

protected override DependencyObject CreateShell()
{
// we don't need the shell
return null;
}

}

这是我的模块,其中包含Database Prism 服务的接口(interface):

[ModuleExport(typeof(IDatabase))]
public class ModuleActivator : IModule
{
public void Initialize()
{
// Do nothing as this module simply provides the API.
}
}
public interface IDatabase
{
// interface methods here ...
}

最后是 Prism 数据库服务本身:

[ModuleExport(typeof(DatabaseImpl), DependsOnModuleNames = new string[] { "IDatabase" })]
public class ModuleActivator : IModule
{
public void Initialize()
{
// Do nothing as this is a library module.
}
}

[Export(typeof(IDatabase))]
public class DatabaseImpl : IDatabase
{
/// implementation here ...
}

在过去的几个小时里尝试了这个,但没有成功。我的 db 导入始终为 null 并且从未初始化。

请注意,如果我在没有 Prism 的情况下执行所有这些操作,但仅使用 MEF,则一切正常。

最佳答案

您不会将任何内容导入到您的 db 字段中,因为 MyService 对象不是由容器创建的 - 它不能由它创建,因为容器实际上是在 Bootstrap 中创建的,它位于 MyService 的构造函数中。

解决这个问题的一个简单方法是在容器初始化后满足对象的导入。为此,您可以像这样在 Bootstrap 中公开容器:

public class MyServiceBoostrapper
{
public CompositionContainer MyServiceContainer
{
get { return Container; }
}

// Rest of bootstrapper definitions...
}

然后修改MyService的构造函数:

public MyService()
{
var bootsrapper = new MyServiceBoostrapper();
bootsrapper.Run();

// This is an extension method. You'll need to add
// System.ComponentModel.Composition to your using statements.
bootstrapper.MyServiceContainer.SatisfyImportsOnce(this);

// At this stage, "db" should not be null.
}

关于c# - WCF 服务中的 Prism 模块系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742441/

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