如何在 PRISM 中注册自定义模块管理器?

发布于 2024-09-13 03:45:35 字数 2759 浏览 0 评论 0原文

我在基于 PRISM 的 silverlight 应用程序中创建了一些简单的自定义 ModuleManager。我也在 bootstrapper 中注册了这个类型,但 PRISM 仍然使用默认管理器。我的 CustomModuleManager 的构造函数被调用,但属性 ModuleTypeLoaders 从未被访问。我想不通,怎样才能让它正常工作?

这是 bootstrapper.cs

protected override void ConfigureContainer()
    {
        Container.RegisterType<IShellProvider, Shell>();
        Container.RegisterType<IModuleManager, CustomModuleManager>();

        base.ConfigureContainer();
    }

CustomModuleManager.cs

public class CustomModuleManager : ModuleManager
{
    IEnumerable<IModuleTypeLoader> _typeLoaders;

    public CustomModuleManager(IModuleInitializer moduleInitializer,
                               IModuleCatalog moduleCatalog,
                               ILoggerFacade loggerFacade)
        : base(moduleInitializer, moduleCatalog, loggerFacade)
    {
        MessageBox.Show("ctor");
    }

    public override IEnumerable<IModuleTypeLoader> ModuleTypeLoaders
    {
        get
        {
            MessageBox.Show("getter");
            if (_typeLoaders == null)
            {
                _typeLoaders = new List<IModuleTypeLoader>
                       {
                         new CustomXapModuleTypeLoader()
                       };
            }

            return _typeLoaders;
        }

        set
        {
            MessageBox.Show("setter");
            _typeLoaders = value;
        }
    }
}

CustomXapModuleTypeLoader.cs

public class CustomXapModuleTypeLoader : XapModuleTypeLoader
{
    protected override IFileDownloader CreateDownloader()
    {
        return new CustomFileDownloader();
    }
}

CustomFileDownloader.cs

public class CustomFileDownloader : IFileDownloader
{
    public event EventHandler<DownloadCompletedEventArgs> DownloadCompleted;
    readonly FileDownloader _dler = new FileDownloader();

    public CustomFileDownloader()
    {
        _dler.DownloadCompleted += DlerDownloadCompleted;
    }

    void DlerDownloadCompleted(object sender, DownloadCompletedEventArgs e)
    {

        _dler.DownloadCompleted -= DlerDownloadCompleted;


        if (DownloadCompleted != null)
        {
            if (e.Cancelled || e.Error != null)
            {
                DownloadCompleted(this, e);
            }
            else
            {
                DownloadCompleted(this,
                  new DownloadCompletedEventArgs(e.Result,
                    e.Error,
                    e.Cancelled,
                    e.UserState));
            }
        }
    }

    public void DownloadAsync(Uri uri, object userToken)
    {
        _dler.DownloadAsync(uri, userToken);
    }
}

I've created some simple custom ModuleManager in my silverlight application based on PRISM. I also registered this type in bootstrapper, but PRISM still use the default manager. The constructor of my CustomModuleManager is called, but the property ModuleTypeLoaders is never accessed. I can't figure it out, how can I make it work properly?

Here is bootstrapper.cs

protected override void ConfigureContainer()
    {
        Container.RegisterType<IShellProvider, Shell>();
        Container.RegisterType<IModuleManager, CustomModuleManager>();

        base.ConfigureContainer();
    }

CustomModuleManager.cs

public class CustomModuleManager : ModuleManager
{
    IEnumerable<IModuleTypeLoader> _typeLoaders;

    public CustomModuleManager(IModuleInitializer moduleInitializer,
                               IModuleCatalog moduleCatalog,
                               ILoggerFacade loggerFacade)
        : base(moduleInitializer, moduleCatalog, loggerFacade)
    {
        MessageBox.Show("ctor");
    }

    public override IEnumerable<IModuleTypeLoader> ModuleTypeLoaders
    {
        get
        {
            MessageBox.Show("getter");
            if (_typeLoaders == null)
            {
                _typeLoaders = new List<IModuleTypeLoader>
                       {
                         new CustomXapModuleTypeLoader()
                       };
            }

            return _typeLoaders;
        }

        set
        {
            MessageBox.Show("setter");
            _typeLoaders = value;
        }
    }
}

CustomXapModuleTypeLoader.cs

public class CustomXapModuleTypeLoader : XapModuleTypeLoader
{
    protected override IFileDownloader CreateDownloader()
    {
        return new CustomFileDownloader();
    }
}

CustomFileDownloader.cs

public class CustomFileDownloader : IFileDownloader
{
    public event EventHandler<DownloadCompletedEventArgs> DownloadCompleted;
    readonly FileDownloader _dler = new FileDownloader();

    public CustomFileDownloader()
    {
        _dler.DownloadCompleted += DlerDownloadCompleted;
    }

    void DlerDownloadCompleted(object sender, DownloadCompletedEventArgs e)
    {

        _dler.DownloadCompleted -= DlerDownloadCompleted;


        if (DownloadCompleted != null)
        {
            if (e.Cancelled || e.Error != null)
            {
                DownloadCompleted(this, e);
            }
            else
            {
                DownloadCompleted(this,
                  new DownloadCompletedEventArgs(e.Result,
                    e.Error,
                    e.Cancelled,
                    e.UserState));
            }
        }
    }

    public void DownloadAsync(Uri uri, object userToken)
    {
        _dler.DownloadAsync(uri, userToken);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谁与争疯 2024-09-20 03:45:37

重新排序对 base.ConfigureContainer 的调用,以便您的获胜(最后一个获胜):

protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    Container.RegisterType<IShellProvider, Shell>();
    Container.RegisterType<IModuleManager, CustomModuleManager>();
}

Reorder your call to base.ConfigureContainer so that yours wins (last one wins):

protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    Container.RegisterType<IShellProvider, Shell>();
    Container.RegisterType<IModuleManager, CustomModuleManager>();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文