c# - MEF构造函数注入(inject)

标签 c# dependency-injection mef constructor-injection

我正在尝试找出 MEF 的构造函数注入(inject)属性。我不知道如何告诉它加载构造函数的参数。

这是我要加载的属性

[ImportMany(typeof(BUsers))]
public IEnumerable<BUsers> LoadBUsers { get; set; }

这是我用来导入程序集的代码。

try
{
    var catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
    catalog.Catalogs.Add(new DirectoryCatalog("DI")); 
    var container = new CompositionContainer(catalog);
    container.ComposeParts(this);
}

这是我要加载的类

[Serializable]
[Export(typeof(BUsers))]
public class EditProfile : BUsers
{
    [ImportingConstructor]
    public EditProfile(string Method, string Version)
    {            
        Version = "2";
        Action = "Edit";
        TypeName = "EditProfile";
    }

最佳答案

当您使用 ImportingConstructor 属性时,构造函数的参数变为导入。默认情况下,您要导入的内容(契约(Contract)名称)基于您要导入的参数或属性的类型。所以在这种情况下,您的两个导入的契约(Contract)类型都是字符串,并且第一个和第二个参数之间没有真正的区别。

看起来您正在尝试使用导入来提供配置值,这不一定是它的设计目的。为了让它做你想做的事,你应该覆盖每个参数的契约(Contract)名称,如下所示:

[ImportingConstructor]
public EditProfile([Import("Method")] string Method, [Import("Version")] string Version)
{ }

然后您需要在容器中导出 Method 和 Version。一种方法是直接添加它们:

var container = new CompositionContainer(catalog);
container.ComposeExportedValue("Method", "MethodValue");
container.ComposeExportedValue("Version", "2.0");
container.ComposeParts(this);

(请注意,ComposeExportedValue 实际上是在静态 AttributedModelServices 类上定义的扩展方法。)

如果您想从某种配置文件中读取这些值,您可以创建自己的导出提供程序,它读取配置并将其中的值作为导出提供给容器。

处理此问题的另一种方法是只导入一个接口(interface),该接口(interface)提供按名称访问配置值的权限,并从构造函数的主体中获取所需的值。

关于c# - MEF构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2008133/

相关文章:

c# - For loop with InsertOnSubmit() - SubmitChanges() 在循环内部或外部

dependency-injection - StructureMap MVC 5 html.Action 问题

asp.net-mvc - ASP.Net MVC 5 中的模块化/插件框架

.net - 在 MEF 中组成部分后自动调用方法

c# - 使用带有目标对象信息的 MEF 注入(inject)对象

c# - 从数值数据类型转换为十进制时出错

c# - "for loop"用于值集合

.net - 对类型 =""属性使用依赖注入(inject)

C# 克隆 EventHandler

c# - 使用 Windsor 注册特定程序集和命名空间中的所有服务?