EF - 3层不安全

时间:2012-06-03 17:25:00

标签: c# entity-framework repository-pattern

假设一个经典的3层应用程序。在DAL中,您有一个GenericRepository,其中T代表您的POCO类,它包括一些方法,如Insert(T实体),Delete(T实体),Update(T实体)等。然后,您的BLL(业务逻辑类)包含类似CustomerRepositor的内容。 好吧,所有的权利。

现在,想象一下你的aspx页面:

var customers = BLL.CustomerRepository.GetAll();
customers.First().Name = "some name"; 

不好,你必须通过CustomerRepository.Update,Insert或Delete方法,以便我可以对所有CRUD操作执行一些验证。通过这种方式,所有业务逻辑都不会像我想象的那样工作。

我注意到没有人从未想过这个,但我认为这是一个重要的问题。如果yuo可以绕过它们,那么为CRUD操作设置业务方法是没有意义的。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

好吧,让我们开始。

var customers = BLL.CustomerRepository.GetAll();

在过去的千禧年中,这是一个很好的代码。在仿制药和LINQ出现之前。 Seirously。

这些天,我希望它至少是这样的:

var customers = BLL.Repository<Customer>.ToList (); //IF you have to materialize

根本不需要“全部”方法;)

  

我错过了什么吗?

在很大程度上理解您仍在申请中,因此妥协是可以接受的。这与您在应用程序之间运行信任边界不同。其次,你应该编写一个更好的抽象。

Repository repository = BLL.GetRepository ();
var customer s repository.Entity<Customer>.ToList ();
customer[0].Name = null;
repository.ValidateU ();
repository.Commit ();

将是更好的抽象。创作不是用“新”完成的,而是用

完成的
var newCustomer = repository.Create<Customer> ();

然后提交。

可以在Validate方法中检查所有验证。

最后,这是关于如何为存储库设计接口 - 如果您坚持不保留任何状态(这是某些操作的有效模式),那么这会让您遇到问题。是的,您可以拥有不进行完全验证的存储库 - 完全有效。这真的取决于。您可能会感到惊讶,但我主要处理应用程序,因为出于性能原因,存储库通常甚至不会在与对象相同的事务中更新,并且更新会排队然后进行批处理,而内存版本则是所有进一步的相关内容操作

最后,它显示了更多关于如何设计DAL界面的想法是正确的,请请停止使用一种完全过时的方法,只是导致方法蠕变(因为你需要大量的否则只会在泛型+ linq表达式树中消失的方法。