ড্যাপার এখন সম্পত্তি ম্যাপারগুলিতে কাস্টম কলাম সমর্থন করে। এটি ITypeMap ইন্টারফেসের মাধ্যমে তা করে । একজন 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; }
}
এটি লক্ষণীয় গুরুত্বপূর্ণ যে কাস্টমপ্রপার্টিটাইপম্যাপের প্রয়োগের জন্য অ্যাট্রিবিউটটি থাকা দরকার এবং কলামের নামের কোনওটির সাথে মেলানো হবে বা সম্পত্তিটি ম্যাপ করা হবে না। DefaultTypeMap বর্গ মান কার্যকারিতা উপলব্ধ করা হয় এবং এই আচরণ পরিবর্তন করার জন্য leveraged করা যেতে পারে:
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>());
সম্পূর্ণ উত্স কোডের এখানে একটি গিস্ট ।