我有一个员工对象:
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。
答案 0 :(得分:1)
问题在于:
您希望获得CreateEmployee
作为您的postdata:
public IHttpActionResult Post([FromBody] CreateEmployee employee)
虽然CreateEmployee
具有ExtendEmployee
属性而非ExtendCreateEmployee
属性。
现在我明白你在这里尝试做了什么,但是你必须明白你不能要求一种类型并传递另一种类型,即使它可以在运行时(多态)做类似的事情。
在您的情况下,web api
活页夹不会知道如何处理工资属性,只需“删除”它。
MEF
是一个知道如何组合类型的框架。
MEF
不会改变您的类型,它只会反映您的类别以及导入和导出之间的匹配。
MEF
无与您客户的帖子有关。