Оказывается, что Dapper легко расширяется, и, объявив простой класс, который расширяет SqlMapper.TypeHandler<T>
, вы можете определить отображение (TypeHandler) между типами System.String
и System.URI
и включить Dapper для выполнения приведения.
Вот как выглядит этот класс:
using System;
using System.Data;
using Dapper;
namespace My.Namespace.Data.DatabaseTools
{
public class DapperUriTypeHandler : SqlMapper.TypeHandler<Uri>
{
public override void SetValue(IDbDataParameter parameter, Uri value)
{
parameter.Value = value.ToString();
}
public override Uri Parse(object value)
{
return new Uri((string)value);
}
}
}
После того как вы объявили отображение, вы можете сообщить об этом Dapper, вызвав метод SqlMapper.AddTypeHandler
и предоставив экземпляр вашего класса обработчика пользовательского типа в качестве параметра, например так:
SqlMapper.AddTypeHandler(new DapperUriTypeHandler());
Лучшее место для вызова SqlMapper.AddTypeHandler
- это где-то в вашей загрузочной конфигурации, чтобы обработчик типов был известен Dapper на раннем этапе выполнения вашего приложения или службы.
Надеюсь, что это поможет другим членам сообщества решить подобные проблемы с Dapper и быстро вводить типы в будущем!