在ASP.NET MVC中使用模型和视图之间的接口

时间:2010-05-20 05:24:11

标签: asp.net-mvc interface

我正在使用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类在Web项目中定义为实现IUser的具体类。 DAL中有一个类似的类实现相同的接口并用于保存数据。但是,当调用userBll.AddUser时,即使两个Users类都实现了接口(InvalidCastException),也无法将User类型的newUser转换为DAL User类。

使用转换运算符可能是一个选项,但它会使DAL和Web之间的依赖性与使用接口的初始目标相悖。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你应该有一个处理依赖注入的项目。 此项目引用您的Domain项目(其中定义了IUserBll),以及具有DLL实现的项目。所以你的MVC项目将引用依赖注入项目并给出一个特定的接口,请求DI实现它。

查看StructureMap或Castle Windsor。

    //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将在后台将依赖项添加到您的控制器中。