мы сопоставляем Entity Framework Entities с объектами домена с Expressions при получении данных из базы данных. Поэтому мы часто получаем что-то вроде этого:
public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
{ Id = db.ID, ... }; // Foo mapping
Но иногда , нам нужно сопоставить другой объект домена в объекте домена Foo, например:
public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
{ Id = db.ID, Foo2 = MapFoo2ToDomain.Invoke(db.FOO2), ... }; // Foo mapping with Foo2 mapping
public static Expression<Func<FOO, Foo>> MapFoo2ToDomain = (db) =>
{ Id = db.ID, ... }; // Foo2 mapping
Но если нам не нужно это отображение, мы не хотим отображать его по причинам производительности. Итак, в настоящее время у нас есть два сопоставления для Foo: одно с отображением Foo2, другое без. Это заканчивается следующим образом:
public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
{ Id = db.ID, ... }; // Foo mapping
public static Expression<Func<FOO, Foo>> MapFooWithFoo2ToDomain = (db) =>
{ Id = db.ID, Foo2 = MapFoo2ToDomain.Invoke(db.FOO2) }; // Foo mapping with Foo2 mapping
Итак, мы заканчиваем дублированием кода (отображением Foo). Это то, что мне очень не нравится, потому что мы должны «поддерживать» два сопоставления вместо одного. Итак, я хочу иметь «базовое сопоставление», которое используют все другие сопоставления, которое затем расширяется специальным сопоставлением. Примерно так:
public static Expression<Func<FOO, Foo>> MapFooToDomainBase = (db) =>
{ Id = db.ID }; // Foo base mapping
public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
MapFooToDomainBase.Invoke(db); // Foo mapping which only uses base mapping
public static Expression<Func<FOO, Foo>> MapFooWithFoo2ToDomain = (db) =>
MapFooToDomainBase.Invoke(db) { Foo2 = MapFoo2ToDomain.Invoke(db.FOO2) }; // Foo with Foo2 mapping which uses Foo base mapping and extends this with Foo2 mapping
Такое возможно? Если да, то как мне этого добиться?
Спасибо за вашу помощь!