【问题标题】:Resolving a dependency in my Service layer解决我的服务层中的依赖关系
【发布时间】:2012-08-03 19:24:23
【问题描述】:

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

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

【问题讨论】:

  • 为什么需要将 Criteria 放入 NInject 中?

标签: c# ninject repository-pattern n-tier-architecture onion-architecture


【解决方案1】:

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

【讨论】:

    【解决方案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>();
        }
    }
    

    【讨论】:

    • +1 来自我。另一种可能更简单的方法是在存储库中使用工厂方法。没有存储库就不可能存在标准,并且存储库也可能负责创建具体的标准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多