【发布时间】:2013-03-13 01:45:15
【问题描述】:
我正在写下面的课
public class UserApplication
{
private IUserRepository UserRepository { get; set; }
private IUserEmailerService UserEmailerService { get; set; }
public UserApplication(IUserRepository userRepository, IUserEmailerService userEmailerService)
{
this.UserRepository = userRepository;
this.UserEmailerService = userEmailerService;
}
public bool Authenticate(string login, string pass)
{
// Here I use UserRepository Dependency
}
public bool ResetPassword(string login, string email)
{
// Here I only use both Dependecies
}
public string GetRemeberText(string login, string email)
{
// Here I only use UserRepository Dependency
}
}
我使用 Unity 来管理我的实例,所以我意识到我只在一个方法上使用两个依赖项,所以当我要求容器为这个类提供一个实例时,两个依赖项都注入到这个类中,但我没有所有方法都需要两个实例,因此在验证用户中我只需要存储库。 那我这样做错了吗?是否有另一种方法仅具有我在此类中的所有情况下使用的依赖关系?
我想使用命令模式,所以我用一种方法对 3 个类进行分类,并且只有我需要的依赖项,如下所示:
public class AuthenticateUserCommand : ICommand
{
private IUserRepository UserRepository { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public void Execute()
{
// executes the steps to do that
}
}
public class ResetUserPasswordCommand : ICommand
{
private IUserRepository UserRepository { get; set; }
private IUserEmailerService UserEmailerService { get; set; }
public string Login { get; set; }
public string Email { get; set; }
public void Execute()
{
// executes the steps to do that
}
}
【问题讨论】:
-
对于 ASP.NET MVC,由于控制器的性质,我可以看到第一个示例更可取,而后一个示例可以很好地与 WPF MVVM 配合使用,因为您可以直接绑定命令。这实际上取决于您使用的是什么技术。
-
没有这个类不是 ASPNET MVC 的一部分,这是我系统的一层。
-
当一个类被注入了一个不是该类主要使用的依赖项时,这可能意味着该类可能正在做它不负责的事情,从而违反了可能不是的 SRP 原则你的情况,我只是建议。
标签: c# dependency-injection domain-driven-design single-responsibility-principle