C# 解决我的服务层中的依赖关系

C# 解决我的服务层中的依赖关系,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

我在试图找出如何解决体系结构中的依赖性问题时遇到了困难。我使用的是NHibernate,我试图用我自己的ICriteriaItem接口来抽象它的ICriteria接口。ICriteriaItem用于我的存储库界面:

ICriteriaItem.cs

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一无所知。我的服务已经被注入到构造函数中。以下是我的选择:

  • 我可以将ICriteriaItem注入构造函数。这感觉很脏,因为每项服务都会注入此内容。我相信我可以用一个基本存储库来实现这一点,但它仍然感觉脏兮兮的

  • 注入内核并在服务中使用它来获取ICriteriaItem的实例。感觉更糟

  • 只需公开ICriteriaItem的具体类,并删除接口

  • 找到另一种方法


  • 想法?我这样做完全错了吗?有更好的办法吗?我缺少什么?

    您可以使用工厂模式,并将其注入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中?