正在解决服务层中的依赖项
本文关键字:依赖 解决 服务 | 更新日期: 2024-09-21 12:16:43
我在想办法解决体系结构中的依赖性问题时遇到了困难。我正在使用NHibernate,并试图用我自己的ICriteriaItem接口来抽象它的ICriteria接口。ICriteriaItem用于我的存储库接口:
ICriteriaItem.cs
public interface ICriteriaItem
{
string PropertyName { get; set; }
object Value { get; set; }
}
IUserRepsository.cs
public interface IUserRepository
{
IEnumerable<User> Find(IList<ICriteriaItem> criteria);
}
我的服务层在其AccountService 中使用此存储库
AccountService.cs
public class AccountService : IAccountService
{
private IUserRepository _userRepo;
private IRoleRepository _roleRepo;
public AccountService(IUserRepository userRepository,
IRoleRepository roleRepository)
{
_userRepo = userRepository;
_roleRepo = roleRepository;
}
public ValidateUser(string username, string password)
{
password = HashPassword(password);
_userRepo.Find(new List<ICriteriaItem>() {
new CriteriaItem() { "Username", username },
new CriteriaItem() { "Password", password},
});
}
}
我的问题是用Ninject获取CriteriaItem的实例。我所有的绑定都是在我的MVC层中完成的,目前,我的服务层对Ninject一无所知。我的服务已经注入构造函数中。以下是我的选择:
我可以将ICriteriaItem注入构造函数中。这感觉很脏,因为每个服务都会注入这个。我确信我可以用一个基本存储库来做这件事,但它仍然感觉很脏。
注入我的内核并在我的服务中使用它来获得ICriteriaItem的实例。感觉更糟。
只需公开ICriteriaItem的具体类并去掉接口。
另辟蹊径。。。
想法?我做错了吗?有更好的方法吗?我在这里错过了什么?
CriteriaItem是一个数据传输对象。DTO永远不应该有任何依赖关系,因此它们不应该使用Nnject。当前的实现是应该的。
您可以使用工厂模式,并将其注入到AccountService构造函数中。
public ICriteriaItemFactory
{
ICriteriaItem GetNew();
}
现在,您的实现需要接受IKernel依赖项,但至少您没有将内核注入到核心类中。
public CriteriaItemFactory : ICriteriaItemFactory
{
private IKernel _kernel;
public CriteriaItemFactory(IKernel kernel)
{
_kernel = kernel;
}
public ICriteriaItem GetNew()
{
return _kernel.Get<ICriteriaItem>();
}
}