我正在使用没有数据库的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变量执行此操作吗?
我是否需要向我的服务类添加方法?
任何想法都将不胜感激!
提前致谢。
答案 0 :(得分:0)
您的代码存在许多问题。首先,你在getter(Things
)中做得太多了。属性本质上应该是轻量级数据访问成员。如果您需要进行繁重的工作,那么在考虑使用方法而不是财产时就是这样。
有了这个问题,你就会遇到一个问题:每当有人访问你的列表时,它就会被重建,因为这是你吸气剂内部的逻辑;每次都重新实例化并构建列表。
第三,您需要在课堂外提供对您的财产的访问权限。目前,您的Things
媒体资源为private
,因此请将其更改为public
或internal
。
这是一种简单的方法:
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列表,那么该列表将再次为空。