Использовать интерфейс между моделью и представлением в ASP.NET MVC - PullRequest
0 голосов
/ 20 мая 2010

Я использую asp.net MVC 2 для разработки сайта. IUser используется как интерфейс между моделью и представлением для лучшего разделения проблем. Однако, здесь все становится немного грязно. В контроллере, который обрабатывает вход пользователя: у меня есть следующее:

        IUserBll userBll = new UserBll();
        IUser newUser = new User();

        newUser.Username = answers[0].ToString();
        newUser.Email = answers[1].ToString();

        userBll.AddUser(newUser);

Класс User определен в веб-проекте как конкретный класс, реализующий IUser. В DAL есть аналогичный класс, реализующий тот же интерфейс и используемый для сохранения данных. Однако при вызове userBll.AddUser newUser типа User не может быть приведен к классу DAL User, даже если оба класса Users реализуют интерфейс (InvalidCastException).

Возможно использование операторов преобразования, но это создаст зависимость между DAL и web, что противоречит первоначальной цели использования интерфейса.

Есть предложения?

1 Ответ

0 голосов
/ 20 мая 2010

У вас должен быть проект, который обрабатывает внедрение зависимостей. Этот проект ссылается на ваш проект домена (где определен IUserBll) и проект, который имеет реализацию DLL. Таким образом, ваш проект MVC будет ссылаться на проект внедрения зависимостей и задан конкретный интерфейс, попросите DI реализовать его.

Взгляните на StructureMap или Замок Виндзор.

    //Global.asax
    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
    }

    //Dependency Injection Project:
    public class StructureMapControllerFactory : DefaultControllerFactory
    {
        protected override IController GetControllerInstance(Type controllerType)
        {
            if (controllerType != null)
            {
                return (IController)ObjectFactory.GetInstance(controllerType);
            }
            return null;
    }
}

Таким образом ваш контроллер может выглядеть так:

public class SomeController
{
  private IUserBll _repository;
  public SomeController(IUserBll repository)
  {
    _repository = repository;
  }

  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Index(Someform f)
  {
      ...
      _repository.AddUser(...);
  }
}

Когда вы используете фабрику контроллеров StructureMap, например, MVC будет получать зависимости в ваш контроллер за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...