Могу ли я использовать перегрузку конструктора с RavenDB? - PullRequest
2 голосов
/ 01 ноября 2019

Я пытался написать разумное решение своей проблемы, но потерпел неудачу. Мне нужно сделать перегрузку конструктора в моей идентичности, в моем домене, сначала для экземпляра объекта, а другой для заполнения 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());
    }
}

1 Ответ

1 голос
/ 06 ноября 2019

Я нашел решение после некоторых исследований. Возможно использовать тег [Json Constructor] в конструкторе для RavenDB, чтобы сериализовать это.

Пример:

    [JsonConstructor]
    public User(string id, string login, string password, string role, string token, string recoveryToken, string googleClientId, string googleClientSecret, string facebookAppId, string facebookAppSecret, Person person)
    {
        Id = id;
        Login = login;
        Password = password;
        Role = role;
        Token = token;
        RecoveryToken = recoveryToken;
        GoogleClientId = googleClientId;
        GoogleClientSecret = googleClientSecret;
        FacebookAppId = facebookAppId;
        FacebookAppSecret = facebookAppSecret;
        Person = person;
    }

Итак, это позволило использовать перегрузку конструктора.

Подробнее см. В документации RavenDb .

...