我的 asp.net 控制器操作将 FormCollection 作为参数。
然后我遍历我自己的集合,在表单集合中查找值等。
我将所有代码移动到我的业务逻辑层,并在我的操作中调用我的业务逻辑层,例如:
SomeManager.Update(formCollection);
但是我对将表单集合传递给我的业务逻辑层感到有点厌倦。
我真的可以在这里选择吗?还有其他想法吗?
还是完全没问题?
我的 asp.net 控制器操作将 FormCollection 作为参数。
然后我遍历我自己的集合,在表单集合中查找值等。
我将所有代码移动到我的业务逻辑层,并在我的操作中调用我的业务逻辑层,例如:
SomeManager.Update(formCollection);
但是我对将表单集合传递给我的业务逻辑层感到有点厌倦。
我真的可以在这里选择吗?还有其他想法吗?
还是完全没问题?
您的业务逻辑层实际上是您的领域模型,领域模型应该以与技术无关的方式表达;即不依赖于任何特定技术,如 ASP.NET MVC、WPF、WCF、EF、NHibernate 或诸如此类。
最好将域模型表示为POCO(普通旧 CLR 对象),但是,正如您已经怀疑的那样,这排除了 FormCollections 和其他特定于 ASP.NET MVC 的类型。
如果您能够将 Update 方法表示为将域对象列表作为输入的方法,那就更好了。
这意味着您需要将 FormCollection 转换为强类型域对象,然后再将其传递给 update 方法。你需要一个映射器来做到这一点。您可以编写自己的自定义映射器或为此使用AutoMapper 。
经验法则是,您不应在业务层或更低层中引用 System.Web.XXX 中的任何内容。在这种情况下,您宁愿使用自定义模型绑定器来摆脱使用 FormCollection。
有关创建模型绑定器的更多信息,请参阅这篇文章。
为什么不创建某种 dto(数据传输对象)然后填充然后通过它。它会更干净一些。
我会创建一个映射器类,它接受一个 FormCollection 并返回一个实例,或者一个类的更新实例。
ManagerMapper.Create(formcollection) 或 ManagerMapper.Update(SomeManager, formcollection)