0

我有一个业务对象层,我在其他几个应用程序中使用它,我想在我的 MVC 应用程序上使用它。我的担忧更多是设计方面的问题:具有以下内容是否正确:

using Interface.MyOtherProject
public class MyMVCController: Controller
{
    [HttpGet]
    public string GetSomethingById(Int32 id)
    {
        return new JavaScriptSerializer().Serialize(MyObject.GetById(id));
    }

}

所以问题是我可以这样做吗,我应该在模型中执行此操作并直接从模型返回这个字符串,还是应该将我的 BLL 重写到我的模型中。我阅读了一些类似问题的答案,但我仍然不清楚我是否可以(而不是我应该或不应该)。我不想打破这种模式,因为我将把这个项目展示给学校里的一些同伴。

谢谢您的帮助!

汉莱特

4

2 回答 2

2

When we had to confront this decision, we went with creating view models that encapsulated/mirrored our business objects. This gives us more control over how the objects should look when serialized in json without having to add view logic in our business layer.

Example: Suppose we had a Person business object:

public class Person
{
  public int Id {get;set;}
  public string Name {get;set;}
}

When a client is going to consume our web service, we wouldn't want them to know what the Id value is, since that's an internal database key. The two options we considered for fixing that is 1) add a [ScriptIgnore] attribute onto Person.Id property or create a separate view model for our Person, which is custom-tailored to the view domain.

We stayed away from option 1 because we didn't want to add view logic in our business layer for much of the same reason you don't... our business layer isn't directly tied to our presentation layer.

This is a very simplified scenario, but the larger idea is still intact. With separate view models you have the ability to include/exclude data in your view without hampering the cleanliness of your business layer.

于 2011-09-14T15:24:29.970 回答
1

我在这里没有看到任何明显的设计问题。要解决问题中的一个特定点:

我应该在模型中执行此操作并直接从模型返回此字符串

你的意思是模型应该提供 JSON 序列化的字符串吗?我会说不。该模型只是业务概念的表示,并包含作用于该概念的逻辑。JavaScriptSerializer基本上是创建该模型的视图。它是 UI 逻辑,并且在演示代码中属于它所在的位置。模型不应该关心它是如何被查看的,它只关心它所代表的状态。

我应该将我的 BLL 重写到我的模型中吗

我不确定你在这里问什么。模型应该包含业务逻辑,这是肯定的。如果您的 BLL 只是一堆将模型用作裸 DTO 的实用程序方法,那么您可能需要考虑将业务逻辑移入模型本身。但是很难用这里提供的代码来判断。

当我看到MyObject.GetById(id)我的图片GetById只是MyObject模型上的一个静态工厂方法,它调用它需要的任何依赖项,例如 DAL 存储库(可能通过方法参数以外的其他方式提供,但希望不是内部实例化),并返回一个的实例MyObject,这似乎很好。我自己也经常使用相同的模式,偶尔尝试我如何命名这些方法以使整个事情更加流畅。

于 2011-09-14T14:19:47.683 回答