Пользовательская проверка для дублированного имени пользователя в БД - PullRequest
0 голосов
/ 05 декабря 2010

Если у вас есть лучший подход для обработки пользовательской проверки, пожалуйста, дайте мне знать. Мне не нужен сервисный слой для этого, пожалуйста.

Читайте ниже 5-й вариант, что я хочу.

У меня есть

1 - IUserRepository -> bool IsUserRegistered(string userName);

2 - Репозиторий пользователей с методом

readonly EFDBContainer _db = new EFDBContainer();
public bool IsUserRegistered(string userName)
{
    return _db.Users.Any(d => d.UserName == userName);
}

3 - Ninject -> UserController - это DI

public static void RegisterServices(IKernel kernel) 
{
    kernel.Bind<IUserRepository>().To<UserRepositary>();
}

4 - UserController

private readonly IUserRepository _repository;
public ProfileController(IUserRepository repository)
{
    _repository = repository;
}

Метод создания на контроллере

HttpPost]
public ActionResult Create(string confirmButton, User user)
{
    if (ModelState.IsValid)
    {
        try
        {
            _repository.Create(user); --> This calling Create Method below before this EnsureValid is Called
            return //Do Redirection

        }
        catch (RuleViolationException)
        {
            this.UpdateModelStateWithViolations(user, ViewData.ModelState);
        }
    }
    return //to View;
}

Метод создания из репозитория

public void Create(User user)
{
    user.EnsureValid(); --> Go to User object and do validation
    //Add object to DB
}

5 - Что я хочу:

Здесь я хочу DI, чтобы я мог вызвать 1-й метод интерфейса IsUserRegistered для объекта User IsUserRegistered ниже не работает прямо сейчас. Мне нужен способ использовать интерфейс

public partial class User: IRuleEntity
{
    public List<RuleViolation> GetRuleViolations()
    {
        List<RuleViolation> validationIssues = new List<RuleViolation>();

        if (IsUserRegistered(userName))
            validationIssues.Add(new RuleViolation("UserName", UserName, "Username already exists. Please enter a different user name."));

        return validationIssues;
    }

    public void EnsureValid()
    {
        List<RuleViolation> issues = GetRuleViolations();

        if (issues.Count != 0)
            throw new RuleViolationException("Business Rule Violations", issues);
    }
}

1 Ответ

2 голосов
/ 05 декабря 2010

Напишите свой собственный атрибут проверки и добавьте его к имени пользователя.

См. http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/. В нем объясняется, как вводить зависимости в валидаторы.

См. Также пример приложения, которое поставляется с расширением Ninject MVC, в нем есть пример валидатора, который имеет зависимость. https://github.com/ninject/ninject.web.mvc

...