使用MEF的Web API中的对象组合

时间:2016-01-23 04:47:38

标签: c# asp.net asp.net-web-api mef

我有一个员工对象:

public class CreateEmployee 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Import]
    public ExtendEmployee ExtendEmployee { get; set; }
}

public class ExtendEmployee
{
    public string Id { get; set; }
}

我想在运行时使用MEF扩展此ExtendEmployee。

[Export]
public class ExtendCreateEmployee : ExtendEmployee
{
    public decimal Salary { get; set; }
}

我想在我的Web API中用ExtendCreateEmployee替换ExtendEmployee。因此使用如下所示的MEF组合物:

private void Compose()
{
    DirectoryCatalog catalog = new DirectoryCatalog(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.dll");
    CompositionContainer container = new CompositionContainer(catalog);
    container.SatisfyImportsOnce(this);
}

我在API的构造函数中调用Compose()。

我的帖子如下:

public IHttpActionResult Post([FromBody] CreateEmployee employee)
{
    return Created(Url.Link("DefaultApi", new { controller = "CreateEmployee" }), "success");
}

我正在将json传递给POST方法:

{
  "firstName": "sample string 1",
  "lastName": "sample string 2",
  "extendAgentCommand": {
    "id": "sample string 1",
    "salary": 123098
  }
}

**

  

问题:“ExtendEmployee”没有被取代   “ExtendCreateEmployee”及其无法接收“薪资”数据   来自json。换句话说,MEF没有组成/替换   具有导入对象的对象。如果我做错了,请帮忙   我怎样才能做到这一点。

在运行时是否可以用ExtendCreateEmployee替换此ExtendEmployee。

1 个答案:

答案 0 :(得分:1)

问题在于:

您希望获得CreateEmployee作为您的postdata:

public IHttpActionResult Post([FromBody] CreateEmployee employee)

虽然CreateEmployee具有ExtendEmployee属性而非ExtendCreateEmployee属性。

现在我明白你在这里尝试做了什么,但是你必须明白你不能要求一种类型并传递另一种类型,即使它可以在运行时(多态)做类似的事情。

在您的情况下,web api活页夹不会知道如何处理工资属性,只需“删除”它。

MEF是一个知道如何组合类型的框架。
MEF不会改变您的类型,它只会反映您的类别以及导入和导出之间的匹配。

MEF 与您客户的帖子有关。