如何将模型实例添加到列表

时间:2018-04-25 18:27:14

标签: c# oop model-view-controller

我正在使用没有数据库的MVC教程。

服务类

namespace Domain.Services
{
    public class ThingService
    {
        private List<Thing> _things;
        private List<Thing> Things
        {
            get
            {
                 if (this._things == null)
                 {
                     this._things = new List<Thing>();
                     this._things.Add(new Thing()
                     {
                         ID = 1,
                         Name = "The red thing",
                         Color = "Red",
                         Size = "Small",
                         Length = 55,
                         DateAvailable = DateTime.Parse("1/1/2018"),
                         IsActive = true
                     });

                     // Add more things

               }

               return this._things;
            }
        }

控制器

namespace WWW.Controllers
{
    public class HomeController : Controller
    {
        private readonly ThingService _thingService;

        public HomeController()
        {
            this._thingService = new ThingService();
        }

        public ActionResult AddThing()
        {
            //add code for a new thing

            return View();
        }
    }
}

我需要帮助将新模型的实例添加到列表中(_things?Things?)。我已经尝试过Service Class的方式并获得范围解析错误。

我可以通过控制器中可用的_thingService变量执行此操作吗?

我是否需要向我的服务类添加方法?

任何想法都将不胜感激!

提前致谢。

2 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。首先,你在getter(Things)中做得太多了。属性本质上应该是轻量级数据访问成员。如果您需要进行繁重的工作,那么在考虑使用方法而不是财产时就是这样。

有了这个问题,你就会遇到一个问题:每当有人访问你的列表时,它就会被重建,因为这是你吸气剂内部的逻辑;每次都重新实例化并构建列表。

第三,您需要在课堂外提供对您的财产的访问权限。目前,您的Things媒体资源为private,因此请将其更改为publicinternal

这是一种简单的方法:

public List<Thing> Things { get; } = new List<Thing>();

它是 public 属性(在您的类外部可访问),它在构造类时实例化列表并提供对列表的只读访问权限,即 new list实例无法分配给它。以下是如何从其他课程中使用它的方法:

this._thingService.Things.Add(...);

答案 1 :(得分:0)

您的媒体资源为private

private List<Thing> Things
{
    //...
}

因此,按照设计,其他类中的任何内容都无法访问它。如果你成功public

public List<Thing> Things
{
    //...
}

然后您可以在任何对象实例上访问它:

public ActionResult AddThing()
{
    this._thingService.Things.Add(new Thing());
    return View();
}

如果您希望它是private,那么您需要提供一些其他方式来访问它。例如,public方法。在那时,重新考虑你的服务的大部分设计是值得的,因为那时你有一个方法只是访问一个属性和一个在其getter中具有大量逻辑的属性。这有点不平衡。理想情况下,该属性只是访问成员数据(可能使用最少的逻辑),并且您的成员初始化逻辑将在构造函数或方法中。

然而,值得注意的是,ThingService的任何新实例都会有一个全新的事物列表(在您第一次访问该属性之后)。所以你可以在控制器中添加一个东西,但只要你指向任何其他页面或做任何其他事情,你就会从头开始重新开始。例如,如果您的控制器操作添加了Thing然后重定向回到Things列表,那么该列表将再次为空。