Can I control object creation using MEF?

I need to add some extensions to our existing code, and I saw MEF as a possible solution. We have an IRandomNumberGenerator interface with a default implementation (ConcreteRNG) that we would like to change. It sounds like an ideal scenario for MEF, but I am having problems with how we create random number generators. Our current code is as follows:

public class Consumer
{
    private List<IRandomNumberGenerator> generators;
    private List<double> seeds;

    public Consumer()
    {
        generators = new List<IRandomNumberGenerator>();
        seeds = new List<double>(new[] {1.0, 2.0, 3.0});

        foreach(var seed in seeds)
        {
            generators.Add(new ConcreteRNG(seed));
        }
    }
}

In other words, the consumer is responsible for making copies of the required RNGs, including providing the seed that is required for each copy.

, RNG MEF ( DirectoryCatalog). , . Generators [Import], ?

, ?

+5
3

MEF, MEF v.Next. , Factory. , :

public interface IRandomNumberGeneratorFactory
{
  IRandomNumberGenerator CreateGenerator(int seed);
}

[Export(typeof(IRandomNumberGeneratorFactory))]
public class ConcreateRNGFactory : IRandomNumberGeneratorFactory
{
  public IRandomNumberGenerator CreateGenerator(int seed)
  {
    return new ConcreateRNG(seed);
  }
}

public class Consumer
{
  [Import(typeof(IRandomNumberGeneratorFactory))]
  private IRandomNumberGeneratorFactory generatorFactory;
  private List<IRandomNumberGenerator> generators;    
  private List<double> seeds;    

  public Consumer()    
  {
    generators = new List<IRandomNumberGenerator>();
    seeds = new List<double>(new[] {1.0, 2.0, 3.0});

    foreach(var seed in seeds)
    {            
      generators.Add(generatorFactory.CreateGenerator(seed));
    }
  }
}
+5

MEF 8 , System.ComponentModel.Composition.dll. . .

MEF . Samples\DynamicInstantiation Microsoft.ComponentModel.Composition.DynamicInstantiation.dll. :

var catalog = new DirectoryCatalog(".");
var dynamicInstantiationProvider  = new DynamicInstantiationProvider();
var container = new CompositionContainer(catalog, dynamicInstantiationProvider);
dynamicInstantiationProvider.SourceProvider = container;

PartCreator<Foo>, Foo. factory , Foo, ..

  • MEF 9 PartCreator ExportFactory, silverlight.
  • MEF 2 Preview 2, ExportFactory . , ExportFactory, , .NET Framework .NET 4.0.
+4

, Lazy Exports. :

[Import]
public Export<IMessageSender> Sender { get; set; }

, . , [Export.GetExportedObject()]. , factory T, , .

0

All Articles