一直在偷看Prism的东西,从图书馆加载。
我有以下图书馆
namespace PersistenceXml
{
[Module(ModuleName = "XmlContext", OnDemand = true)]
public class XmlContext : IContext<XElement>, IModule
{
private readonly string fileName = @"Text.xml";
public XElement Create()
{
return XElement.Load(fileName);
}
public void Initialize()
{
}
}
}
我在另一个项目中有一个WPF应用程序,实现了以下
namespace Presentation
{
class Bootstrapper : UnityBootstrapper
{
protected override System.Windows.DependencyObject CreateShell()
{
return this.Container.TryResolve<MainWindow>();
}
protected override void InitializeShell()
{
Application.Current.MainWindow = (Window)this.Shell;
Application.Current.MainWindow.Show();
}
protected override void InitializeModules()
{
base.InitializeModules();
}
protected override Microsoft.Practices.Prism.Modularity.IModuleCatalog CreateModuleCatalog()
{
var c = new Microsoft.Practices.Prism.Modularity.DirectoryModuleCatalog() { ModulePath = @".\Modules" };
return c;
}
}
}
和xaml窗口
namespace Presentation
{
public partial class MainWindow : Window
{
public IUnityContainer Container { get; set; }
public MainWindow(IUnityContainer container)
{
InitializeComponent();
this.Container = container;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var b = Container.IsRegistered(typeof(Interfaces.IContext<XElement>), "XmlContext");
int i = 10;
}
}
}
现在我将PersistenceXml.dll放在Modules目录中,以便Presentation可以加载它。 在Bootstrapper.CreateModuleCatalog中,我可以看到它已经加载了1个项目。我的模块。 但是在MainWindow中,当我试图查看XmlContext是否已注册时,我得到了错误。
我做错了什么?
由于 -G。
更新:
更改了PersistenceXml库。现在有一个类调用Persistence实现IModule。持久化构造函数已注入IUnityContainer。 Initialize在PersistenceXml中执行任何其他类的容器注册。
namespace PersistenceXml
{
[Module(ModuleName = "Persistence", OnDemand = true)]
public class Persistence : IModule
{
private IUnityContainer container;
public Persistence(IUnityContainer container)
{
this.container = container;
}
public void Initialize()
{
container.RegisterType<IContext<XElement>, XmlContext> ("XmlContext");
}
}
}
namespace PersistenceXml
{
public class XmlContext : IContext<XElement>
{
private readonly string fileName = @"Text.xml";
public XElement Create()
{
return XElement.Load(fileName);
}
}
}
还是不太对劲。
答案 0 :(得分:0)
除非您注册,否则XMLContext未注册为IContext<Element>
。
答案 1 :(得分:0)
见上面的更新。
在库内部的类中正确实现IModule,该类注入了IUnityContainer并存储起来供以后使用。在IModule Initialize方法中配置特定于库的容器注册。
namespace PersistenceXml
{
[Module(ModuleName = "Persistence", OnDemand = true)]
public class Persistence : IModule
{
private IUnityContainer container;
public Persistence(IUnityContainer container)
{
this.container = container;
}
public void Initialize()
{
container.RegisterType<IContext<XElement>, XmlContext> ("XmlContext");
}
}
}