MEF: Passing different constructor parameters to a part when using CreationPolicy.NonShared

If the answer to both the above questions is no, then are there any other ways to accomplish this with a combination of MEF and some other DI/IOC framework?

I think the answer to question 1 and 2 is indeed no.

I would try AutoFac which gives you more fine grained control and integrates with MEF. For example, it allows you to set up registrations like this so that Bar and Baz instances get their Foo instance with a different parameter:

builder.Register(c => new Bar(new Foo(param));
builder.Register(c => new Baz(new Foo(param2));

If you want to use different instances of same interface depending upon some logic (apply strategy pattern) in MEF one way to use ExportMetadata Attribute. For example if you have IDbManager and if you have two implementation of it say one Oracle and One Sql then 1. Create metadata interface which will hold metadata

public interface IDbManagerMetadata
{
    DataProvider DataProvider { get; }
}

2. Create Attribute class as below

[MetadataAttribute]
public class DbManagerMetadataAttribute : Attribute, IDbManagerMetadata
{
    public DataProvider DataProvider { get; set; }
}
  1. Strategy example
public enum DataProvider
{
    Oracle,
    Sql,
}
[InheritedExport]
public interface IDbManager
{
    void Initialize();
}

[InheritedExport(typeof(IDbManager))]
public class DbManager : IDbManager
{
    public DbManager(DataProvider providerType)
    {
        _providerType = providerType;
    }

    public void Initialize()
    {
        Console.WriteLine("provider : {0}", _providerType);
    }

    public DataProvider _providerType { get; set; }
}

And Two different Implementations

[Export(typeof(IDbManager))]
[DbManagerMetadata(DataProvider = DataProvider.Oracle)]
public sealed class OracleDataProvider : DbManager
{
    public OracleDataProvider():base(DataProvider.Oracle)
    {

    }
}

And

[Export(typeof(IDbManager))]
[DbManagerMetadata(DataProvider = DataProvider.Sql)]
public sealed class SqlDataProvider : DbManager
{
    public SqlDataProvider()
        : base(DataProvider.Sql)
    {
    }
}

And you can decide which one to use by using Metadata interface we created in first step as in repository shown below

[Export]
public class Repository
{
    private IDbManager _dbManager;

    private readonly IEnumerable<Lazy<IDbManager, IDbManagerMetadata>> DbManagers;

    [ImportingConstructor]
    public Repository([ImportMany(typeof(IDbManager))]IEnumerable<Lazy<IDbManager, IDbManagerMetadata>> dbManagers)
    {
        this.DbManagers = dbManagers;
        var _dbManager = DbManagers.First(x => x.Metadata.DataProvider == DataProvider.Oracle).Value;
    }

    public void Execute()
    {
        var oracleDbManager = DbManagers.First(x => x.Metadata.DataProvider == DataProvider.Oracle).Value;

        oracleDbManager.Initialize();

        var sqlDbManager = DbManagers.First(x => x.Metadata.DataProvider == DataProvider.Sql).Value;

        sqlDbManager.Initialize();
    }
}