【问题标题】:How Should viewmodels communicate with repositories?视图模型应该如何与存储库通信?
【发布时间】:2011-02-15 20:56:12
【问题描述】:

我有一堆存储库。他们从 EF 3.5 生成的模型中检索数据。为了简单起见,我们只称它们为 repository1、2 和 3。它们都实现了通用接口:public interface IRepository<T>{..} 我的视图模型应该如何与这些存储库通信?我试图用IRepository GetRepository(string repositoryName){..}方法创建某种工厂,但我无法让它工作。那么我应该只在需要时引用视图模型中的存储库,还是有更好的解决方案?我想要一个代码示例,谢谢。

干杯

【问题讨论】:

    标签: c# repository viewmodel mvvm


    【解决方案1】:

    These answers 和来自Dependency Injection in .NETfree introduction-chapter 建议将存储库和用户界面与业务逻辑分开。依赖项应该像这样进入核心逻辑:

    dal/repositories -> 业务层、模型和 IRepository

    我也想知道 ViewModel 的位置。它们绝对不应该连接到存储库,但 ViewModel 是否属于业务层(服务层)或 UI 似乎值得商榷。我只是盯着 asp.net mvc,目前最喜欢把它们放在业务层中以保持控制器的简单。同样,业务层从逻辑上属于一起的各种存储库中收集项目并通过 ViewModel 一起执行这些项目似乎是合理的。也许作为一个事务,所以对所有存储库的更新必须成功或回滚。

    【讨论】:

      【解决方案2】:

      我想不出您的视图模型应该与您的存储库通信的情况。 ViewModel 应该是供客户端使用的平面模型。

      你到底想做什么?

      【讨论】:

      • 您实际上是如何制作视图模型的?如果您是手动执行 DI 或使用某种容器,您会在视图模型中注入什么?
      【解决方案3】:

      您可能会发现 WPF Application Framework (WAF)BookLibrary 示例应用程序很有趣。它使用实体框架和 MVVM。但它没有引入与实体框架一起使用的存储库。

      【讨论】:

        【解决方案4】:

        A Repository 为 T 提供服务。我所做的是向我的 T 添加一个静态属性以通过 IOC 获取存储库:

        public class Part // This is one kind of T
        {
            public static IRepository<Part> Repository { get { return IoC.GetInstance<IRepository<Part>>(); } }
            ...
        }
        

        那么当我需要一个零件时...

        var part = Part.Repository.Find(id);
        

        对于我的单元测试,IoC 提供了模拟存储库。在生产中,真实的东西。

        【讨论】:

        • 对不起,我对这一切都很陌生,所以我不熟悉 IoC 的概念..
        • @Ols:在您的情况下,将(return) IoC.GetInstance&lt;IRepository&lt;Part&gt;&gt;(); 替换为return new Repository&lt;Part&gt;(); 可能就可以了。
        • @Ols1:您将获得一些巨大的乐趣和巨大的设计改进。大量的 IoC 资源。从这里开始:en.wikipedia.org/wiki/Inversion_of_control
        • public IRepository GetRepository(string RepositoryName) { //TO DO: 附加逻辑 return new IRepository(); }
        • 这怎么行不通?这个 public IRepository GetRepository(string RepositoryName) { return new EmployeeRepository>(); }
        猜你喜欢
        • 2011-01-15
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多