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

时间:2010-08-02 08:52:41

标签: silverlight module prism

我在基于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);
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

    Container.RegisterType<IShellProvider, Shell>();
    Container.RegisterType<IModuleManager, CustomModuleManager>();
}
相关问题