0

我有这个架构:

------(WPF APPLICATION)(XAML,ViewModels)(了解业务逻辑但不了解 DAL)

------(类库)(业务逻辑)(了解 DAL)

------(类库)(DAL - 实体框架(模型优先))(不参考任何人)

我的问题是我的 DAL 不知道任何业务逻辑类,所以在我的 DAL 中,如果我得到一个比如说一个人的列表,我会返回 IEnumerable。例如:

public static IEnumerable GetPersons()
  {
       using(StaffEntities context = new StaffEntities())
       {
            return context.Persons.ToList();
       }

  }

因此,当我从业务逻辑层获得结果时,我对每个实体都有一个对应的类,例如 DAL 中的人实体,我在业务逻辑层中有 clsPerson。但是我的视图模型不知道 DAL 它只知道业务逻辑类因此 clsPerson 所以我的业务逻辑中的代码变成了

例如:

 public static IEnumerable GetclsPersons()
{ return DAL.GetPersons(); }

我的大问题是每次我得到一些东西的列表,保存或删除一些东西时,我必须在我的 ViewModel 中使用反射

所以如果我有一个绑定到我的 xaml 的 clsPerson 属性:

public IEnumerable clsPersons { get; set; }
public ListCollectionView clsPersonList { get; set; }

clsPersons = BLL.GetclsPersons();
clsPersonList = new ListCollectionView((IList)clsPersons);

public clsPerson CurrentclsPerson { get; set; }

每次我为“CurrentclsPerson”赋值时,我都必须使用反射

CurrentclsPerson.Firstname = clsPersonList.CurrentItem.GetType().GetProperty("Firstname")
.GetValue(clsPersonList.CurrentItem,null).ToString();

我希望不在我的视图模型中使用反射我正在考虑将我的业务逻辑和 DAL 放在一个类库中,这样我就不必使用 IEnumerable

你们用什么?

有没有办法避免这种情况?

有没有办法解决?

请帮助..谢谢。

4

2 回答 2

1

一种解决方案是将您的模型对象放在一个 dll 中并在任何地方引用它。如果您将所有逻辑排除在模型对象之外,这将非常简单且足够好。

另一方面,您可能希望在 GUI 中使用绑定,因此您需要对象来实现某些接口(如 INotifyPropertyChanged)。您仍然可以拥有两个单独的实体分支并使用映射在它们之间进行转换。Automapper是一种可以帮助您解决此问题的工具。

我正在使用 T4 模板将 ToDto 和 ToEntity 方法添加到我的类中,以便在它们之间进行转换。

于 2012-09-09T14:58:46.557 回答
0

我会在您的商务课程中执行以下操作:

public static IEnumerable GetPersons()
{
   using(StaffEntities context = new StaffEntities())
   {
        return from person in context.Persons.ToList()
               select new Person()
               {
                   Firstname = person.Firstname
               }
   }
}
于 2012-09-09T16:14:22.987 回答