Таблица:
CREATE TABLE Instrument
( Id INT IDENTITY
, Name VARCHAR(50)
, Tenor VARCHAR(10)
//...
Модель:
interface ITenor
{
int Length { get; }
string ToString();
}
class DayTenor : ITenor
{
public int Length
{
get { return 1; }
}
public override string ToString()
{
return "DAY";
}
}
class MonthTenor : ITenor
{
public int Length
{
get { return 30; }
}
public override string ToString()
{
return "MONTH";
}
}
class TenorFactory
{
ITenor GetTenor(string tenorString)
{
switch (tenorString)
{
case "DAY":
return new DayTenor();
break;
case "MONTH":
return new MonthTenor();
break;
default:
throw new NotImplementedException(string.Format( "Tenor {0} is not implemented", tenorString ));
}
}
}
class Instrument
{
public int Id { get; set; }
public string Name { get; set; }
public ITenor Tenor { get; set; }
}
class InstrumentMap : ClassMap<Instrument>
{
public InstrumentMap()
{
WithTable( "Instrument" );
Id( x => x.Id );
Map( x => x.Name );
Map( x => x.Tenor );
}
}
Это большое упрощение проблемной области.
Строка Map( x => x.Tenor );
явно не будет работать, поскольку вы не можете неявно преобразовать столбец VARCHAR в тип ITenor. Можно ли сопоставить способ автоматического использования Factory для получения ITenor, который требуется для указанной строки в БД, и использования ToString () из класса ITenor для возврата обратно в БД?
Если нет, то какой рефакторинг вы бы порекомендовали сделать это осуществимым? Большое спасибо