views:

94

answers:

1

Hi, 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);
    }
}
A: 

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>();
}
Anderson Imes