我需要创建一个Web应用程序,我想使用MVC.但是,我的模型不能是标准模型之一 - 数据不存储在数据库中,而是存储在只能通过API访问的外部应用程序中.由于这是我实现的第一个MVC应用程序,我依靠示例来了解如何实现它.我找不到任何非基于数据库的模型的例子.自定义模型的一个例子也可以.谁能指点我这样的野兽?也许MVC只是新的而且不存在.
看起来我可能能够使用DataSet模型,但是我没有看到任何如何使用这个对象的例子.我希望DataSet的一个例子也可以帮助我.(也许是同一回事?)
请注意:我已经看到了无数的自定义绑定示例.这不是我想要的.我需要一个自定义模型的示例,它不依赖于特定的数据库/表.
UPDATE
我在MS找到了一个很好的例子:
http://msdn.microsoft.com/en-us/library/dd405231.aspx
虽然这是我的问题的"答案",但我并不喜欢它,因为它将我与MS的世界观联系在一起.@Aaronaught,@ jerenh和@tvanfosson从元视角给出了更好的答案,即在使用MVC方面向前推进我的理解(以及你的理解?).
我把支票给@Aaronaught,因为他实际上有一些示例代码(我要求它.)谢谢大家,如果有的话,请随时添加更好的答案.
在大多数情况下,实际应用数据的后备源应该是什么并不重要; 模型应该完全一样.事实上,使用类似存储库之类的主要原因之一是您可以轻松更改底层存储.
例如,我有一个使用大量Web服务的MVC应用程序 - 很少有它可以访问本地数据库,除了身份验证和用户配置文件之类的简单事情.典型的模型类可能如下所示:
[DataContract(Namespace = "http://services.acme.com")]
public class Customer
{
[DataMember(Name = "CustomerID")]
public Guid ID { get; set; }
[DataMember(Name = "CustomerName")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我将有一个如下所示的存储库界面:
public interface ICustomerRepository
{
Customer GetCustomerByID(Guid id);
IList<Customer> List();
}
Run Code Online (Sandbox Code Playgroud)
"API"全部封装在具体的存储库中:
public class AcmeWSCustomerRepository : ICustomerRepository, IDisposable
{
private Acme.Services.CrmServiceSoapClient client;
public AcmeWSCustomerRepository()
: this(new Acme.Services.CrmServiceSoapClient())
public AcmeWSCustomerRepository(Acme.Services.CrmServiceSoapClient client)
{
if (client == null)
throw new ArgumentNullException("client");
this.client = client;
}
public void Dispose()
{
client.SafeClose(); // Extension method to close WCF proxies
}
public Customer GetCustomerByID(Guid id)
{
return client.GetCustomerByID(id);
}
public IList<Customer> List()
{
return client.GetAllCustomers();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我也可能有一个本地测试存储库,只有少数客户可以读取XML文件:
public class LocalCustomerRepository : ICustomerRepository, IDisposable
{
private XDocument doc;
public LocalCustomerRepository(string fileName)
{
doc = XDocument.Load(fileName);
}
public void Dispose()
{
}
public Customer GetCustomerByID(Guid id)
{
return
(from c in doc.Descendants("Customer")
select new Customer(c.Element("ID").Value, c.Element("Name").Value))
.FirstOrDefault();
}
// etc.
}
Run Code Online (Sandbox Code Playgroud)
我试图在这里提出的观点是,这与任何特定的数据库无关.在这种情况下,一个可能的来源是WCF服务; 另一个是磁盘上的文件.两者都不一定具有兼容的"模型".在这种情况下,我假设WCF服务公开了一个我可以直接映射到DataContract属性的模型,但Linq-to-XML版本是纯API; 没有模型,它是所有自定义映射.
一个非常好的域模型实际上应该完全独立于真正的数据源.当人们告诉我Linq to SQL或Entity Framework模型足以在整个应用程序/站点中使用时,我总是有点怀疑.通常这些与"人"模型不匹配,只是创建一堆ViewModel类不一定是答案.
从某种意义上说,如果你没有交出现有的关系模型,那实际上会更好.它迫使您真正考虑应用程序的最佳域模型,而不一定是最容易映射到某个数据库的域模型.因此,如果您还没有来自数据库的模型 - 构建一个!只需使用POCO类并在必要时使用属性进行装饰,然后创建将此域模型映射到API或从API映射的存储库或服务.
| 归档时间: |
|
| 查看次数: |
2332 次 |
| 最近记录: |