【问题标题】:Reference different model objects in .net class library depending on the project it's included in根据包含的项目,在 .net 类库中引用不同的模型对象
【发布时间】:2014-01-11 11:33:39
【问题描述】:

我当前的解决方案具有以下设置:

  • 带有我的模型的可移植类库
  • 具有处理所有数据库流量的存储库的类库
    • 使用模型引用可移植类库
  • WPF 项目
    • 引用模型和存储库
  • Windows 应用商店应用
    • 使用模型引用可移植类库
  • ASP MVC 网站
    • 引用模型和存储库

在我不得不将数据验证添加到 WPF 项目之前,此设置对我来说一直运行良好。我必须在模型上使用 IDataErrorInfo。由于可移植类库不支持 IDataErrorInfo,所以我有点卡住了。

我尝试为我的可移植类库中的每个模型类添加一个同名的新模型类到我的 WPF 项目中,并从我的库中的类继承。然后我可以在子类中添加所有验证代码。问题当然是我的 WPF 项目将类库与我的存储库一起使用,它返回我的模型基类的实例(来自可移植类库)。在我的 WPF 项目中强制转换模型类的每一次出现似乎都不是可行的方法..

所以我的问题是:我可以让存储库类库根据它所使用的项目返回不同的模型对象吗? (始终是基础类,但在 WPF 项目中使用时是子类)。 (我确实意识到让存储库 lib 了解我的 wpf 项目并不是最好的主意,但如果这是我所需要的,我可以接受。)

如果还有其他方法可以实现我的目标,请告诉!

【问题讨论】:

    标签: c# .net wpf class-library portable-class-library


    【解决方案1】:

    听起来很棘手。我想到了不同的解决方案。

    为您拥有的每个模型类创建一个接口。

    • 优点: WPF 应用不需要关心具体的实现。您可以通过存储库或类似的方式引入它们。
    • 缺点:需要大量工作,WPF设计器不能很好地处理接口,所以你必须创建假货或者:

    使用T4 生成您的类/接口

    • 优点:你没有接口可以带来的维护。此外,您不必多次反映更改(模型、接口、假)。
    • 缺点:你必须深入研究它:),其他的暂时没有想到。

    【讨论】:

      【解决方案2】:

      设置起来很复杂,但您可以自己在可移植库中定义IDataErrorInfo,然后在包含该类型的平台上,将 PCL 替换为具有类型转发的库的类型。

      请在此处查看我的答案以了解更多信息:Is there any way I can implement IValidatableObject on Portable Class Library Project?

      【讨论】:

        【解决方案3】:

        这可能是partial classes 的一个很好的应用程序

        在您的类库中,模型类被定义为部分:

        public partial class MyModelClass
        {
            ...
        }
        

        WPF 应用程序可以添加定义,例如像这样:

        public partial class MyModelCLass : IDataErrorInfo
        {
            public string this[string columnName]
            ...
            public string Error { get; private set; }
            ...
        }
        

        【讨论】:

        • 好像不能跨项目使用部分类。无赖!
        猜你喜欢
        • 1970-01-01
        • 2017-04-29
        • 2013-03-12
        • 2015-09-04
        • 2011-09-20
        • 1970-01-01
        • 2023-03-21
        • 2011-10-31
        • 2011-10-24
        相关资源
        最近更新 更多