依赖注入IModule和DirectoryModuleCatalog

时间:2016-06-07 20:01:31

标签: wpf unity-container prism

一直在偷看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);
        }
    }
}

还是不太对劲。

2 个答案:

答案 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");
        }
    }
}