Dapper sekarang mendukung kolom khusus ke pemetaan properti. Ia melakukannya melalui antarmuka ITypeMap . Kelas CustomPropertyTypeMap disediakan oleh Dapper yang dapat melakukan sebagian besar pekerjaan ini. Sebagai contoh:
Dapper.SqlMapper.SetTypeMap(
typeof(TModel),
new CustomPropertyTypeMap(
typeof(TModel),
(type, columnName) =>
type.GetProperties().FirstOrDefault(prop =>
prop.GetCustomAttributes(false)
.OfType<ColumnAttribute>()
.Any(attr => attr.Name == columnName))));
Dan modelnya:
public class TModel {
[Column(Name="my_property")]
public int MyProperty { get; set; }
}
Penting untuk dicatat bahwa implementasi CustomPropertyTypeMap mensyaratkan bahwa atribut ada dan cocok dengan salah satu nama kolom atau properti tidak akan dipetakan. Kelas DefaultTypeMap menyediakan fungsionalitas standar dan dapat dimanfaatkan untuk mengubah perilaku ini:
public class FallbackTypeMapper : SqlMapper.ITypeMap
{
private readonly IEnumerable<SqlMapper.ITypeMap> _mappers;
public FallbackTypeMapper(IEnumerable<SqlMapper.ITypeMap> mappers)
{
_mappers = mappers;
}
public SqlMapper.IMemberMap GetMember(string columnName)
{
foreach (var mapper in _mappers)
{
try
{
var result = mapper.GetMember(columnName);
if (result != null)
{
return result;
}
}
catch (NotImplementedException nix)
{
// the CustomPropertyTypeMap only supports a no-args
// constructor and throws a not implemented exception.
// to work around that, catch and ignore.
}
}
return null;
}
// implement other interface methods similarly
// required sometime after version 1.13 of dapper
public ConstructorInfo FindExplicitConstructor()
{
return _mappers
.Select(mapper => mapper.FindExplicitConstructor())
.FirstOrDefault(result => result != null);
}
}
Dan dengan itu, mudah untuk membuat mapper tipe khusus yang secara otomatis akan menggunakan atribut jika mereka ada tetapi sebaliknya akan kembali ke perilaku standar:
public class ColumnAttributeTypeMapper<T> : FallbackTypeMapper
{
public ColumnAttributeTypeMapper()
: base(new SqlMapper.ITypeMap[]
{
new CustomPropertyTypeMap(
typeof(T),
(type, columnName) =>
type.GetProperties().FirstOrDefault(prop =>
prop.GetCustomAttributes(false)
.OfType<ColumnAttribute>()
.Any(attr => attr.Name == columnName)
)
),
new DefaultTypeMap(typeof(T))
})
{
}
}
Itu berarti kita sekarang dapat dengan mudah mendukung tipe yang memerlukan peta menggunakan atribut:
Dapper.SqlMapper.SetTypeMap(
typeof(MyModel),
new ColumnAttributeTypeMapper<MyModel>());
Berikut adalah Intisari ke kode sumber lengkap .