2016-01-23 9 views
0

У меня есть объект работника:состав объекта в 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; } 
} 

Я хочу продлить этот ExtendEmployee во время выполнения с помощью MEF.

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

Я хочу, чтобы заменить ExtendEmployee с ExtendCreateEmployee в моем Web API. Следовательно, используя 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); 
} 

я называю Compose() в конструктор API.

И мой пост, как показано ниже:

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 не компонует/не заменяет объект объектом Imported. Пожалуйста, помогите, если я делаю что-то неправильно и как я могу это достичь.

Есть ли способ, в котором я могу заменить этот ExtendEmployee с ExtendCreateEmployee во время выполнения.

ответ

1

Проблема здесь:

Вы ожидаете получить CreateEmployee как ваш PostData:

public IHttpActionResult Post([FromBody] CreateEmployee employee) 

Хотя CreateEmployee имеет ExtendEmployee свойство, а не ExtendCreateEmployee недвижимость.

Теперь я понимаю, что вы пытались сделать здесь, но вы должны понимать, что не можете запрашивать один тип и передавать другой тип, даже если это возможно сделать во время выполнения (полиморфизм).

В вашем случае связующее web api не будет знать, что делать с свойством зарплаты и просто «отбросить» его.

MEF - это структура, которая умеет создавать типы.
MEF не изменит ваши типы, он просто отразит ваши классы и сопоставление между импортом и экспортом.

MEF имеет ничего делать с сообщением от своего клиента.

+0

Спасибо. Но есть ли способ заменить этот ExtendEmployee ExtendCreateEmployee во время выполнения. – Satyajit

+0

Да. Вы можете создать собственное связующее -> http://blog.learningtree.com/creating-a-custom-web-api-model-binder/ или http://chimera.labs.oreilly.com/books/1234000001708/13 каналов.html # _model_binders Другой способ - использовать JObject (json.net) и обрабатывать конкретное преобразование объекта самостоятельно (используя метод ToObject). –

+0

Спасибо, пробовал с JObject и ToObject. Он все еще не учитывает поле «зарплата» во время сопоставления. – Satyajit