理解 MEF 容器部件生命週期和實現是很是重要的事情。考慮到 MEF 關注可擴展應用程序。這變得尤其重要。生命期能夠解釋爲指望部件的共享性(transitively, its exports)html
[PartCreationPolicy(CreationPolicy.NonShared)] [Export(typeof(IMessageSender))] public class SmtpSender : IMessageSender { public void Send(string message) { throw new NotImplementedException(); } } public interface IMessageSender { void Send(string message); }
[Export] public class Importer { [Import(RequiredCreationPolicy = CreationPolicy.NonShared)] public Dependency Dep { get; set; } }
- | Part.Any | Part.Shared | Part.NonShared |
---|---|---|---|
Import.Any | Shared | Shared | Non Shared |
Import.Shared | Shared | Shared | No Match |
Import.NonShared | Non Shared | No Match | Non Shared |
var batchProcessorExport = container.GetExport<IBatchProcessor>(); var batchProcessor = batchProcessorExport.Value; batchProcessor.Process(); container.ReleaseExport(batchProcessorExport);
[Export] public class SomeService : IDisposable { [Import] public ILogger Logger { get; set; } public void Dispose() { Logger.Info("Disposing"); // might throw exception! } }
using System; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.ComponentModel.Composition.Primitives; class Program { static void Main(string[] args) { var catalog = new AssemblyCatalog(typeof(Program).Assembly); var container = new CompositionContainer(catalog); var root = new Root(); // add external part container.ComposeParts(root); // ... use the composed root instance // removes external part batch = new CompositionBatch(); batch.RemovePart(root); container.Compose(batch); } } public class Root { [Import(RequiredCreationPolicy = CreationPolicy.NonShared)] public NonSharedDependency Dep { get; set; } } [Export, PartCreationPolicy(CreationPolicy.NonShared)] public class NonSharedDependency : IDisposable { public NonSharedDependency() { } public void Dispose() { Console.WriteLine("Disposed"); } }