3

我在试图弄清楚如何解决我的架构中的依赖问题时遇到了麻烦。我正在使用 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);
}

我的服务层在其 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. 找别的方法...

想法?我在这一切都错了吗?有没有更好的办法?我在这里想念什么?

4

2 回答 2

4

CriteriaItem 是一个数据传输对象。DTO 不应该有任何依赖关系,因此不应该使用 Nnject 创建它们。当前的实现应该是这样。

于 2012-08-04T23:30:59.353 回答
2

您可以使用工厂模式,并将其注入您的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>();
    }
}
于 2012-08-03T19:32:31.783 回答