簡體   English   中英

MEF 組合使用 ImportMany 和可組合部件的現有實例

[英]MEF composition using ImportMany and existing instances of composable parts

我有以下問題:

在 MEF 上使用ImportMany屬性時,MEF 將始終至少創建一個IService接口的實現實例。

由於我已經有一個現有實例(通過在下面的代碼中創建一個實例並將其作為組合批處理的一部分進行模擬),我只想在 ServiceHost 實例的 Services 屬性中包含此實例。 (當然還有來自具有相同接口實現的其他類型的實例..)

但是 MEF 總是也會創建一個新實例並將其推送到 Services 屬性,以便有兩個實例 - 我自己創建的一個和 MEF 創建的一個。

如何防止 MEF 創建自己的實例?

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;

namespace TestConsole
{
    public interface IService
    {
        int InstanceId { get; }
    }

    public class Program
    {
        public static int counter;

        private static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost();

            DirectoryCatalog catalog = new DirectoryCatalog(".", "*.exe");
            CompositionContainer container = new CompositionContainer(catalog);
            CompositionBatch compositionBatch = new CompositionBatch();

            // create an existing instance
            TestService c = new TestService();
            ComposablePart part = AttributedModelServices.CreatePart(c);
            compositionBatch.AddPart(part);
            Console.WriteLine("existing instance: {0}", c.InstanceId);

            compositionBatch.AddPart(AttributedModelServices.CreatePart(host));

            container.Compose(compositionBatch);

            foreach (var service in host.Services)
            {
                Console.WriteLine(service.InstanceId);
            }
        }
    }

    public class ServiceHost
    {
        [ImportMany]
        public IService[] Services { get; set; }
    }

    [Export(typeof(IService))]
    public class TestService : IService
    {
        public TestService()
        {
            this.InstanceId = ++Program.counter;
        }

        public int InstanceId { get; private set; }
    }
}

謝謝..伯尼

所以它按預期工作。 它找到 2 個實例,因為您添加了兩個實例(一個手動添加,一個來自 DirectoryCatalog)。

您必須做出決定:讓 MEF 管理您的實例,還是自己做。

如果可能,請刪除[Export(typeof(IService))]並使用AddExportedValue而不是部分,如下所示:

// create an existing instance
TestService c = new TestService();
compositionBatch.AddExportedValue<IService>(c);

在這種情況下,您手動將您的實例添加到 compositionBatch,而 DirectoryCatalog 找不到它,原因是 class 沒有[Exported]屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM