C# 解决我的服务层中的依赖关系
我在试图找出如何解决体系结构中的依赖性问题时遇到了困难。我使用的是NHibernate,我试图用我自己的ICriteriaItem接口来抽象它的ICriteria接口。ICriteriaItem用于我的存储库界面: ICriteriaItem.csC# 解决我的服务层中的依赖关系,c#,ninject,repository-pattern,n-tier-architecture,onion-architecture,C#,Ninject,Repository Pattern,N Tier Architecture,Onion Architecture,我在试图找出如何解决体系结构中的依赖性问题时遇到了困难。我使用的是NHibernate,我试图用我自己的ICriteriaItem接口来抽象它的ICriteria接口。ICriteriaItem用于我的存储库界面: ICriteriaItem.cs public interface ICriteriaItem { string PropertyName { get; set; } object Value { get; set; } } IUSERrepository.cs p
public interface ICriteriaItem
{
string PropertyName { get; set; }
object Value { get; set; }
}
IUSERrepository.cs
public interface IUserRepository
{
IEnumerable<User> Find(IList<ICriteriaItem> criteria);
}
公共接口存储库
{
IEnumerable Find(IList标准);
}
我的服务层在其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},
});
}
}
公共类AccountService:IAccountService
{
私有IUserRepository_userRepo;
私人IRoleRepository_roleRepo;
公共帐户服务(IUserRepository userRepository,
IRoleRepository(角色还原)
{
_userRepo=userRepository;
_roleRepo=roleRepository;
}
公共ValidateUser(字符串用户名、字符串密码)
{
密码=HashPassword(密码);
_userRepo.Find(新列表(){
新的CriteriaItem(){“Username”,Username},
新的CriteriaItem(){“Password”,Password},
});
}
}
我的问题是使用Ninject获取CriteriaItem的实例。我的所有绑定都是在MVC层完成的,目前,我的服务层对Ninject一无所知。我的服务已经被注入到构造函数中。以下是我的选择:
想法?我这样做完全错了吗?有更好的办法吗?我缺少什么?您可以使用工厂模式,并将其注入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>();
}
}
公共CriteriaItemFactory:ICriteriaItemFactory
{
私有IKernel_内核;
公共CriteriaItemFactory(IKernel内核)
{
_内核=内核;
}
公共ICriteriaItem GetNew()
{
返回_kernel.Get();
}
}
CriteriaItem是一个数据传输对象。DTO不应该有任何依赖项,因此不应该使用Nnject创建它们。当前的实现应该是这样的 +1来自我。另一种可能更简单的方法是在存储库中使用工厂方法。如果没有存储库,标准不太可能存在,而且存储库可能负责创建具体的标准。为什么需要将标准放入NInject中?