迷惑:为什么项目里面,有些地方使用了工作单元特性而有些地方没有使用呢?
答案:在ABP中,一个应用服务方法默认是一个工作单元。
由于一个应用服务(Application Services)方法就是一个工作单元,所以数据库连接在方法执行期间都是开启的。如果你在非应用服务(Application Services)中调用GetAll(),你需要显式的使用工作单元模式。如:在Controller的Action方法中要使用GetAll()或调用多个有对数据库操作的AppService方法时, 应该将Action方法使用virtual修饰,并在Action的上面通过[UnitOfWork]进行显示开启工作单元模式。
拓展:对于工作单元方法(应用服务(Application Services)方法),在方法结束时ABP将会自动保存所有数据修改。假设我们需要一个应用服务(Application Services)方法来更新一个Person的Name
public void UpdateName(UpdateNameInput input)
{
var person = _personRepository.Get(input.PersonId);
person.Name = input.NewName;
}
就是这样,Name被成功修改!我们甚至不需要调用_personRepository.Update方法。ORM框架在工作单元中会跟踪所有实体修改并将修改更新到数据库中。
再拓展:所有应用服务(Application Services)实例的生命周期都是暂时的(Transient)。这意味着在每次使用都会创建新的应用服务(Application Services)实例。这边的Transient,别的资料里叫做瞬时性,真TM傻逼,谁能理解瞬时性是个啥,当时我直接理解成马上销毁的对象。无语