MVC自定义模型 - 一个简单的例子在哪里?

Hog*_*gan 3 asp.net-mvc

我需要创建一个Web应用程序,我想使用MVC.但是,我的模型不能是标准模型之一 - 数据不存储在数据库中,而是存储在只能通过API访问的外部应用程序中.由于这是我实现的第一个MVC应用程序,我依靠示例来了解如何实现它.我找不到任何非基于数据库的模型的例子.自定义模型的一个例子也可以.谁能指点我这样的野兽?也许MVC只是新的而且不存在.

看起来我可能能够使用DataSet模型,但是我没有看到任何如何使用这个对象的例子.我希望DataSet的一个例子也可以帮助我.(也许是同一回事?)

请注意:我已经看到了无数的自定义绑定示例.这不是我想要的.我需要一个自定义模型的示例,它不依赖于特定的数据库/表.

UPDATE

我在MS找到了一个很好的例子:

http://msdn.microsoft.com/en-us/library/dd405231.aspx

虽然这是我的问题的"答案",但我并不喜欢它,因为它将我与MS的世界观联系在一起.@Aaronaught,@ jerenh和@tvanfosson从元视角给出了更好的答案,即在使用MVC方面向前推进我的理解(以及你的理解?).

我把支票给@Aaronaught,因为他实际上有一些示例代码(我要求它.)谢谢大家,如果有的话,请随时添加更好的答案.

Aar*_*ght 5

在大多数情况下,实际应用数据的后备源应该是什么并不重要; 模型应该完全一样.事实上,使用类似存储库之类的主要原因之一是您可以轻松更改底层存储.

例如,我有一个使用大量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映射的存储库或服务.