实现我自己的 IUserType 时如何访问 property/mapping-attributes
How can I access property/mapping-attributes when implementing my own IUserType
我实现了自己的类型PaddedString
,在映射中是这样使用的-xml:
<?xml version="1.0"
encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="MyClass">
<!-- id is omitted here -->
<property name="MyProperty"
length="300"
type="TypeNamespace.PaddedString, TypeAssembly"/>
</class>
</hibernate-mapping>
所以,我已经按照 this great code-project article 来实现我的 TrimmedString
,我想我可以用它作为我的 PaddedString
:
的指南
public sealed class PaddedString : IUserType,
IEnhancedUserType
{
// I am leaving out all the other methods, because NullSafeGet is the only one with the "real" logic
public object NullSafeGet(IDataReader rs,
string[] names,
object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs,
names[0]);
var length = 300; // How do I read the attribute `length` of the mapping in here?
if (obj == null)
{
return new string(' ',
length);
}
return obj.ToString()
.PadRight(length,
' ');
}
}
需要的部分很清楚:如何读取映射的属性length
?或者您知道在 PaddedString
中注入长度的任何其他方法吗?
我已经通过合并 IParameterizedType
解决了这个问题,例如:
public sealed class PaddedString : IUserType,
IEnhancedUserType,
IParameterizedType
{
private int Length { get; set; }
public void SetParameterValues(IDictionary<string, string> parameters)
{
this.Length = int.Parse(parameters["length"]);
}
public object NullSafeGet(IDataReader rs,
string[] names,
object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs,
names[0]);
if (obj == null)
{
return new string(' ',
this.Length);
}
return obj.ToString()
.PadRight(this.Length,
' ');
}
}
然后我这样使用:
<?xml version="1.0"
encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="MyClass">
<!-- id is omitted here -->
<property name="MyProperty">
<type name="TypeNamespace.PaddedString, TypeAssembly">
<param name="length">300</length>
</type>
</property>
</class>
</hibernate-mapping>
我实现了自己的类型PaddedString
,在映射中是这样使用的-xml:
<?xml version="1.0"
encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="MyClass">
<!-- id is omitted here -->
<property name="MyProperty"
length="300"
type="TypeNamespace.PaddedString, TypeAssembly"/>
</class>
</hibernate-mapping>
所以,我已经按照 this great code-project article 来实现我的 TrimmedString
,我想我可以用它作为我的 PaddedString
:
public sealed class PaddedString : IUserType,
IEnhancedUserType
{
// I am leaving out all the other methods, because NullSafeGet is the only one with the "real" logic
public object NullSafeGet(IDataReader rs,
string[] names,
object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs,
names[0]);
var length = 300; // How do I read the attribute `length` of the mapping in here?
if (obj == null)
{
return new string(' ',
length);
}
return obj.ToString()
.PadRight(length,
' ');
}
}
需要的部分很清楚:如何读取映射的属性length
?或者您知道在 PaddedString
中注入长度的任何其他方法吗?
我已经通过合并 IParameterizedType
解决了这个问题,例如:
public sealed class PaddedString : IUserType,
IEnhancedUserType,
IParameterizedType
{
private int Length { get; set; }
public void SetParameterValues(IDictionary<string, string> parameters)
{
this.Length = int.Parse(parameters["length"]);
}
public object NullSafeGet(IDataReader rs,
string[] names,
object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs,
names[0]);
if (obj == null)
{
return new string(' ',
this.Length);
}
return obj.ToString()
.PadRight(this.Length,
' ');
}
}
然后我这样使用:
<?xml version="1.0"
encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="MyClass">
<!-- id is omitted here -->
<property name="MyProperty">
<type name="TypeNamespace.PaddedString, TypeAssembly">
<param name="length">300</length>
</type>
</property>
</class>
</hibernate-mapping>