【问题标题】:Use interface between model and view in ASP.NET MVC在 ASP.NET MVC 中使用模型和视图之间的接口
【发布时间】:2010-05-20 05:24:10
【问题描述】:

我正在使用 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 之间产生依赖关系,这与使用接口的最初目标背道而驰。

有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc interface


    【解决方案1】:

    你应该有一个处理依赖注入的项目。 该项目引用了您的域项目(其中定义了 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 会在后台将依赖项获取到您的控制器中。

    【讨论】:

    • 是的,我了解 DI 的好处。然而,这里的主要问题是处理用户类型。 _repository.AddUser(...) 还是传入一个 User 对象吧?
    • 我的观点是,您可以通过在(DI 项目和 Web)和(具有 IUserBll 的项目和网络)。 Web 项目从不引用/具有对 DAL 项目的依赖项。控制器工厂将对 DAL.UserBll 进行存储库实例化并将其作为 IUserBll 返回。
    • 同意。我遇到的另一个难题是 IUser 及其在 DAL 和 Web 中的实现。 IUser 定义了公共属性,而 DAL 和 Web 可能有不同的实现,哪些附加属性只有 DAL 或 Web 关心。但在我看来,我需要使用 IUser 属性填充 DAL 用户,而不是在 IUserBll.AddUser(IUser) 中分配 DAL 用户特定属性,而不是将 Web 用户转换为 DAL 用户。
    • 好吧,我不建议将域类型(IUser)放在 DAL 项目中。将它们保存在自己的项目中,DAL 存储库仍然可以引用、填充和返回它们。
    • 是的,IUser 在一个单独的项目中,DAL 可以参考。下面的用户类型在 DAL 中定义,并且强制转换抛出 InvalidCastException: public int AddUser(IUser user) { int ret = 0;使用 (MyEntities 实体 = new MyEntities()) {entities.AddToUsers(user as User); //
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多