Следуя некоторым курсам Владимира Хорикова по DDD, я абстрагировал некоторые свойства примитивного класса в ValueObjects. Например, свойство Username
моего объекта Account
представляло собой строку, но для проверки его в качестве концепции домена я создал тип Username
.
Это привело к прекращению работы QueryOver, см. Код.
Я получаю исключение: NHibernate.QueryException: 'could not resolve property: Username.Value of: PtPro.Domain.Account.Account'
// Account.cs
public class Account : AggregateRoot
{
private string _username;
public virtual Username Username
{
get => (Username)_username;
set => _username = value;
}
} // Rest of class removed for brevity
// AccountMap.cs
public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
Id(x => x.Id);
Map(x => x.Username).CustomType<string>().Access.CamelCaseField(Prefix.Underscore);
References(Reveal.Member<Account, Client>("Client"))
.Cascade
.SaveUpdate();
}
} // Rest of class removed
// AccountRepository.cs
public Account GetWithClientByUsername(string username)
{
Account ac = null;
Client cl = null;
var account = _session.QueryOver<Account>(() => ac)
.JoinAlias(() => ac.Client, () => cl)
.Where(() => ac.Username.Value == username)
.SingleOrDefault<Account>();
return account;
}
// Username.cs
public class Username : ValueObject<Username>
{
public string Value { get; }
private Username() { }
private Username(string value)
{
Value = value;
}
public static Result<Username> Create(string username)
{
username = (username ?? string.Empty).Trim();
if (username.Length == 0)
return Result.Fail<Username>("Username is invalid");
return Result.Ok(new Username(username));
}
public static implicit operator string(Username username)
{
return username.Value;
}
public static explicit operator Username(string username)
{
return Create(username).Value;
}
protected override bool EqualsCore(Username other)
{
return other.Value.Equals(Value);
}
protected override int GetHashCodeCore()
{
return Value.GetHashCode();
}
}