Я пытался написать разумное решение своей проблемы, но потерпел неудачу. Мне нужно сделать перегрузку конструктора в моей идентичности, в моем домене, сначала для экземпляра объекта, а другой для заполнения RavenDB. Это не имеет большого значения, верно? Но RavenDB не работает с более чем одним конструктором, как показано в сообщении:
Message = "Невозможно найти конструктор для использования с типом Project.Domain.Business.Users.User. Классдолжен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, помеченный атрибутом JsonConstructor. Путь 'Логин'. "
Идея состоит в том, чтобы сохранить внутри моей идентичности некоторые правила домена, которые необходимы прикто-то делает экземпляр объекта. Как мы можем видеть в следующих примерах:
My Identity User:
namespace Project.Domain.Business.Users
{
public class User
{
public string Id { get; private set; }
public string Login { get; private set; }
public string Password { get; private set; }
public string Role { get; private set; }
public string Token { get; private set; }
public string RecoveryToken { get; private set; }
public string GoogleClientId { get; private set; }
public string GoogleClientSecret { get; private set; }
public string FacebookAppId { get; private set; }
public string FacebookAppSecret { get; private set; }
public Person Person { get; private set; }
public User(string login, string password, string googleClientId, string googleClientSecret, string facebookAppId, string facebookAppSecret, Person person)
{
Id = Guid.NewGuid().ToString();
Login = login;
Password = SecurityHolder.EncryptPassword(password);
Role = "Common";
Token = SecurityHolder.GetHash_HMACSHA256(login + "_" + password);
RecoveryToken = SecurityHolder.GetHash_HMACSHA256(login);
GoogleClientId = googleClientId;
GoogleClientSecret = googleClientSecret;
FacebookAppId = facebookAppId;
FacebookAppSecret = facebookAppSecret;
Person = person;
}
}
}
Объект, созданный в моем сервисе (или как угодно, может быть в контроллере, например):
var emailObject = new Email(email);
var cellPhoneNumberObject = new Phone(cellPhoneNumber);
var naturalPerson = new NaturalPerson(name, gender, birth, emailObject, cellPhoneNumberObject, description);
var user = new User(login, password, googleClientId, googleClientSecret, facebookAppId, facebookAppSecret, naturalPerson);
var userResults = _userValidation.IsValid(user);
if (userResults.IsValid)
{
_userRepository.Create(user);
}
else
{
throw new Exception(userResults.ToString("~"));
}
Я думал использовать креативный шаблон проектирования для создания экземпляра моего объекта, возможно, фабрики, и установки общедоступных атрибутов идентификации. Итак, RavenDB тоже должен работать нормально. Но я не знаю, правильный ли это путь.
Редактировать:
Как спросил меня Гарай. Метод create реализован в UserRepository:
public class UserRepository : IUserRepository
{
private readonly IUnitOfWork _unitOfWork;
public UserRepository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public User GetById(string id)
{
var session = _unitOfWork.OpenSession();
return session.Load<User>(id);
}
public void Create(User user)
{
var session = _unitOfWork.OpenSession();
session.Store(user);
session.SaveChanges();
}
public void Edit(User user)
{
var session = _unitOfWork.OpenSession();
session.SaveChanges();
}
}
Шаблон единицы работы, используемый для сохранения сеанса состояния ворона в заданной области. Важно, чтобы пользователи выбирали и обновляли в моих сервисах.
Код единицы измерения:
public class UnitOfWork : IUnitOfWork
{
private readonly IDocumentStore _documentStore;
private IDocumentSession _documentSession;
public UnitOfWork(IDocumentStoreHolder documentStoreHolder)
{
_documentStore = documentStoreHolder.DocumentStore;
_documentSession = null;
}
public IDocumentSession OpenSession()
{
return _documentSession ?? (_documentSession = _documentStore.OpenSession());
}
}