2012-05-13 58 views
1

我为我的网站做了一个设置页面。在这个页面上,用户可以看到他们可以操纵的一大堆网站设置。我做到了这一点,当用户选择一个设置时,页面将自动运行一个ajax请求将设置发送到数据库。我的问题是我如何做到这一点。MVC 3 /设计模式问题

起初,我只是打电话给存储库。一次调用以获取数据,将其放入ViewModel中,然后将该ViewModel赋予View,并将ajax控制器仅将设置发送回数据库。这种方式似乎是最好的,尤其是对于单元测试的目的,因为如果需要的话,我可以传入一个虚假的存储库。然后,为了让用户获得设置,他们只需调用存储库并传入他们想要的设置名称。

然后我有一个好主意。我创建了一个名为SiteWideSettings的单例类,并且该网站上的每个可能设置都是该网站的一个属性。第一次调用SiteSettings时,所有设置都会被加载。当任何属性调用Set时,它将调用存储库函数发送设置。现在用我的设置视图,我只是通过SiteWideViewOptions.Current和ajax调用我正在更新已更改的属性。这对我很有用,但它不是单元测试,因为我的构造函数是私有的,所以我不能真正将一个存储库传递给单例的构造函数。我现在有的工作正常,但我不觉得这是最好的解决方案,单元测试在这里不是真的可行。

我在考虑以下其中一项,但不确定哪一项最好。

  • 存储库属性添加到SiteWideSettings类
  • 功能添加到SiteWideSettings类在库通过
  • 不使用此一单在所有的,只是回到我在做什么之前我有这个想法

对此的任何评论将不胜感激。

注:我知道。我知道我在这种情况下做单元测试是错误的,因为我没有先写测试,所以请不要责备我..我已经责骂自己,我的下一个任务,我不会再做我承诺:)

回答

1

“然后,我有一个好主意。我做了所谓的 SiteWideSettings和一个单独的类...”

这听起来像一个坏主意。让你的数据库成为真实的设置是什么,而不是你现在需要保持最新的一些内存中缓存。让你的ORM做缓存,如果你需要它的表现,否则你只是添加问题,特别是如果你现在尝试在多台服务器上运行你的网站。

如果您想简化控制器,使其中的“设置”和“拆卸”代码更少,请使用IOC(例如Autofac)并注入所需的任何依赖关系(例如DataContext或Repository )在每个http请求的基础上。

您的操作方法现在更容易测试,因为您可以简单地实例化控制器(使用其构造函数手动注入依赖项),然后调用您的方法。

+0

至于保持最新我不太担心,因为所有对数据库访问SiteSettings数据的访问都将从这个类中完成..您说在多个服务器上运行可能存在问题。我仍然不在Sr.当涉及到web开发时,开发人员的水平很高,所以我很好奇拥有一组webservers而不是一个web服务器会有什么样的问题? 我在最后一个开发部门,我们部署到了一群web服务器,我从来没有遇到过问题。我只是好奇你所看到的以及这种情况如何面对问题。感谢您的快速回复 –

+1

使用单一服务器很容易,您可以在本地缓存内容而不用担心,但只要有多个系统更新数据库,您就需要处理它。更重要的是,正如你所意识到的,单身人士还有其他问题,尤其是关于可测性。 –

+0

感谢您的咨询! –