2

我正在尝试使用 DryIoc Mef 库来扫描所有具有导出属性的程序集

我看到这个关于Mef和 DryIoc 的链接

我将方法更改为 RegisterExports,但没有注入 IGreeter 属性。如果我自己注册每一个,它就可以工作(Foo/Greeter)。

using DryIoc;
using DryIoc.MefAttributedModel;
using System;
using DryIocAttributes;

namespace ConsoleApp3
{
class Program
{
    public static IContainer C;
    static void Main(string[] args)
    {
         Program.C = new Container().With(rules => rules.With( propertiesAndFields: PropertiesAndFields.Auto)).WithMefAttributedModel();

        Program.C.RegisterExports(new Assembly[] { typeof(Foo).GetAssembly() });
        
        var foo = new Foo();
        foo.Message();
        Console.ReadLine();
    }
}

public interface IGreeter
{
    string ShowGreet();
}

[ExportEx]
public class Greeter : IGreeter
{
    public Greeter() { }
    public string ShowGreet()
    {
        return "Hello World";
    }
}

[ExportEx]
public class Foo
{
    public IGreeter greet { get; set; }

    public void Message()
    {
        Program.C.InjectPropertiesAndFields(this);
        Console.WriteLine($"Show {greet.ShowGreet()}");
    }
}

}

4

2 回答 2

0

答案是更改为ExportEx(typeof(IGreeter))ExportMany。后者将发现已实现的接口并将其导出。还要注意类型的可见性 -ExportMany默认情况下不导出非公共类型,但可以通过属性属性进行更改。

于 2021-11-05T08:32:37.677 回答
0

接口 IGreeter 需要的属性

[InheritedExport]    
public interface IGreeter
{
    string ShowGreet();
}
于 2021-11-04T22:20:10.773 回答