Dapper अब प्रॉपर्टी मैपर्स को कस्टम कॉलम सपोर्ट करता है। यह ITypeMap इंटरफ़ेस के माध्यम से ऐसा करता है। Dapper द्वारा एक CustomPropertyTypeMap वर्ग प्रदान किया जाता है जो इस कार्य को कर सकता है। उदाहरण के लिए:
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))));
और मॉडल:
public class TModel {
[Column(Name="my_property")]
public int MyProperty { get; set; }
}
यह नोट करना महत्वपूर्ण है कि CustomPropertyTypeMap के कार्यान्वयन के लिए आवश्यक है कि विशेषता मौजूद हो और स्तंभ नामों में से एक से मेल खाए या संपत्ति मैप नहीं की जाएगी। DefaultTypeMap वर्ग मानक सुविधा प्रदान करता है और इस व्यवहार को बदलने के लिए उपयोग किया जा सकता:
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);
}
}
और उस जगह के साथ, एक कस्टम प्रकार का मैपर बनाना आसान हो जाता है जो स्वचालित रूप से विशेषताओं का उपयोग करेगा यदि वे मौजूद हैं, लेकिन अन्यथा मानक व्यवहार पर वापस आ जाएंगे:
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))
})
{
}
}
इसका मतलब है कि अब हम आसानी से उन प्रकारों का समर्थन कर सकते हैं जिनके लिए विशेषताओं का उपयोग करके मानचित्र की आवश्यकता होती है:
Dapper.SqlMapper.SetTypeMap(
typeof(MyModel),
new ColumnAttributeTypeMapper<MyModel>());
यहां पूर्ण स्रोत कोड के लिए एक Gist है ।