C# 需要更新存储库的未知更改

C# 需要更新存储库的未知更改,c#,repository,domain-driven-design,C#,Repository,Domain Driven Design,我有一个Employee实体,其方法是Authenticate(SecureString密码)在此方法中,LastAuthenticatedDate私有成员将被更改,并期望它将被持久化 尽管这使得“调用层”非常尴尬,因为它们现在需要执行以下操作(没有失败,否则数据将不正确): 这是非常尴尬的,我可以看到这种模式在我的域模型中随处可见,我的期望是它应该自动保存到持久性存储中,但是不需要以某种方式注入存储库(或服务?),我不知道这是怎么可能的 域模型不知道持久性,但是可以注入iaauthentica

我有一个
Employee
实体,其方法是
Authenticate(SecureString密码)
在此方法中,
LastAuthenticatedDate
私有成员将被更改,并期望它将被持久化

尽管这使得“调用层”非常尴尬,因为它们现在需要执行以下操作(没有失败,否则数据将不正确):

这是非常尴尬的,我可以看到这种模式在我的域模型中随处可见,我的期望是它应该自动保存到持久性存储中,但是不需要以某种方式注入存储库(或服务?),我不知道这是怎么可能的

域模型不知道持久性,但是可以注入
iaauthenticationservice
,并通过双重分派为我更新存储库。就DDD而言,这是正确的方法吗

更新 下面的代码片段可能有助于更好地了解我在做什么

public bool Authenticate(SecureString password)
{
    bool isSuccess = false;
    var hash = new HashedPassword(password, Password.Salt);

    if (Password.Validate(hash))
    {
        _lastLogin = DateTimeOffset.Now;
        isSuccess = true;
    }

    DomainEvents.RaiseEvent(new EmployeeAuthenticationEvent(this, isSuccess));
    return isSuccess;
}

我不会将存储库或服务层注入到您的域模型中,如果这是您所要求的

我会将您正在谈论的代码放在域服务层中

class EmployeeAuthenticationService implements AuthenticationService {
    public void authenticate(Employee employee, String password) {
        if (employee.Authenticate(password)) {
            // do stuff
            employeeRepository.Update(myEmployee);   
        }
    }            
}

您的存储库的范围是如何确定的?如果您在web应用程序的请求级别对其进行范围界定,那么在dispose上,它们可以保留对域模型的任何更改。因此,正在处理的存储库是您的自动
更新
调用。这是一个好主意!我不确定我是否理解你所说的“你的存储库是如何确定范围的?”是什么意思,您能澄清一下吗?尽管这需要我在内存中保留一个对获取的实体的引用列表,并在
ixxxrepository
的所有其他实现上施加类似的预期行为,更不用说列表是否很大,并且更新每个实体可能会影响性能。。。我当前的实现是一个实体框架的抽象,我将持久性模型映射到存储库中的域模型(另一个在DDD中很难有效解决的问题)EF像NHibernate一样跟踪对象,不是吗?我们/我的设置是让NHibernate跟踪引用,并在请求结束时(通过请求范围中的Ninject
InRequestScope
)执行一个简单的
Commit
)保存所有内容。DDD对于此设置尤其糟糕是。。这就是为什么我尝试使用DDD和事件源(因为阻抗不匹配可能是DDD的杀手)。EF跟踪自己的实体,但在我的实现中,EF实体仅用于通过静态方法SomeEntity.Restore将从数据库读取的数据传输到我的域模型(各种参数)在存储库方法中调用。事实证明,在EF上保留一组单独的域实体比它的价值更麻烦。。几乎..这是一个向贫乏的域模型的下滑,提供了这样一个实现的服务保证了一个问题:为什么我甚至应该对员工使用
身份验证
方法,而只是将所有代码放在服务中?此外,IMO有两个接口,表明它们执行相同的操作,但它们的实现在预期行为上有所不同,这是不好的。然而,我认为在这种情况下,应该使用服务来验证员工,根据我所知的良好OO实践,为什么雇员应该知道如何自我认证?事实上,我必须同意雇员不应该知道如何自我认证。如果您更改代码,使上述服务使用employee对象的属性进行身份验证(我认为使用应用程序服务),它将不再倾向于一个贫乏的域模型。。。有人建议我使用
Authenticate
(请参阅OP中的更新)方法引发的域事件来持久化不变量的内部状态更改(在本例中为最后登录日期)。使用域服务将意味着公开一些设置_lastLogin字段的方法,这是不令人满意的,这个特定的不变量(以及许多类似的不变量)应该完全封装起来,仅用于公开读取。。。也许是向后看的
employee.Authenticate(密码,authenticationService)
?但该路由的问题在于,不清楚上面的层首先应该使用什么进行身份验证。他们是使用直接的
身份验证(Employee,SecureString)
接口方法还是通过员工?
class EmployeeAuthenticationService implements AuthenticationService {
    public void authenticate(Employee employee, String password) {
        if (employee.Authenticate(password)) {
            // do stuff
            employeeRepository.Update(myEmployee);   
        }
    }            
}