Я использую AutoMapper для отображения объектов между различными слоями моего приложения.С одной стороны, у меня есть интерфейс, который выглядит следующим образом:
public interface MyRepo
{
IEnumerable<IRootObject> GetItems(param);
}
IRootObject выглядит так:
public interface IRootObject
{
int Id { get; set; }
DateTime? Date { get; set; }
}
public interface IFirstSubObject : IRootObject
{
string MyFirstProp { get; set; }
}
public interface ISecondSubObject : IRootObject
{
string MySecondProp { get; set; }
}
Таким образом, вызов GetItems()
на самом деле возвращает массив только IxxxSubObjectItems
.С другой стороны структура выглядит следующим образом:
public abstract class MyCustomRoot
{
protected MyCustomRoot(){}
public int Id { get; set; }
public DateTime? Date { get; set; }
}
public class MyCustomFirstSub : MyCustomRoot
{
public MyCustomFirstSub() : base() {}
public string MyFirstProp { get; set; }
}
public class MyCustomSecondSub : MyCustomRoot
{
public MyCustomSecondSub () : base() {}
public string MySecondProp { get; set; }
}
Теперь я настроил маппер примерно так:
AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
.Include<IFirstSubObject, MyCustomFirstSub>
.Include<ISecondSubObject, MyCustomSecondSub>();
AutoMapper.Mapper.CreateMap<IFirstSubObject, MyCustomFirstSub>();
AutoMapper.Mapper.CreateMap<ISecondSubObject, MyCustomSecondSub>();
Но я продолжаю получать MapperExceptions («Не удается создать абстрактный класс»)., что имеет смысл в некотором смысле).Я также называю AssertConfigurationIsValid
, и это подходит для этого кода.
Если я не делаю класс MyCustomRoot
абстрактным, тогда отображение работает, но я получаю список MyCustomRoot
объектов, тогда как на самом делехотелось бы иметь список MyCustomxxxSub
, потому что позже есть Фабрика, которая использует этот тип для генерации правильного интерфейса ...
Я надеюсь, что кто-то может указать мне правильное направление для этого!
Спасибо!