正在解决服务层中的依赖项

本文关键字:依赖 解决 服务 | 更新日期: 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一无所知。我的服务已经注入构造函数中。以下是我的选择:

  1. 我可以将ICriteriaItem注入构造函数中。这感觉很脏,因为每个服务都会注入这个。我确信我可以用一个基本存储库来做这件事,但它仍然感觉很脏。

  2. 注入我的内核并在我的服务中使用它来获得ICriteriaItem的实例。感觉更糟。

  3. 只需公开ICriteriaItem的具体类并去掉接口。

  4. 另辟蹊径。。。

想法?我做错了吗?有更好的方法吗?我在这里错过了什么?

正在解决服务层中的依赖项

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>();
    }
}