1

我的解决方案中有几个项目可以访问相同的数据,因此稍后我将在单独的项目中实现数据访问。目前我正在使用 EF4、通用存储库和工作单元模式。我已经设计了我的数据访问以支持依赖注入,并且我想使用 Ninject。这是我到目前为止的示例

public class Account 
{
    public int Id { get; set; }
    public Guid WebId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
    public string Mobile { get; set; }

}

public interface IRepository<T>
{
    IEnumerable<T> Get(Expression<Func<T, bool>> filter, Func<IQueryable<T>);
    T GetById(int id);
    void Update(T dinner);
    void Insert(T dinner);
    void Delete(int id);
    void Save();
}

我还有一个存储库实现,我不会在这里发布它以供篇幅。

我的 UnitOfWork 看起来像这样

public class UnitOfWork
{        
    private Repository<Account> _accountRepository;
    public IRepository<Account> AccountRepository
    {
        get
        {
            if (this._accountRepository == null)
            {
                _accountRepository = new Repository<Account>();
            }
            return _accountRepository;
        }
    }       
}

我如何以及在哪里设置 ninject 来自动解析我的存储库,这样我就可以使用该接口而无需在我的工作单元中实例化它。这是正确的做法还是我完全错误地理解了 DI?这是我认为我希望我的工作单元看起来像的样子

public class UnitOfWork
{
    IKernel _kernel;

    public UnitOfWork()
    {
        _kernel = new StandardKernel();
    }

    private IRepository<Account> _accountRepository;

    public IRepository<Account> AccountRepository
    {
        get
        {
            if (this._accountRepository == null)
            {
                _accountRepository = _kernel.Get<IRepository<Account>>();;
            }
            return _accountRepository;
        }
    }

}
4

1 回答 1

0

依赖注入倾向于使用称为组合根的概念。这是您的应用程序中的一个地方,您的应用程序的对象图的组合发生在这里。

本质上,您不会在库中使用依赖注入容器。您的库可能包含可以注入的对象,但它往往是基于应用程序的工具,而不是基于库的工具。

这意味着如果您只创建一个库,则不会在其中使用依赖注入容器,也不会在其中配置容器。相反,您将创建您的库以使用来自您的应用程序的依赖注入。在您的情况下,您只需设计您的存储库、工作单元等,以通过构造函数注入接受其依赖项。然后,在使用库的应用程序中,您将使用 DI 容器(例如 Ninject)来配置对象的创建方式。

这做了很多事情。首先,它允许应用程序控制对象的创建方式。例如,如果您在 Web 应用程序中使用您的库,那么您可以将其配置为创建您的存储库的一个实例,该实例在一个请求的生命周期中存在。如果您的库这样做,那么您将无法在应用程序级别对此进行控制。

其次,如果您在库中使用 DI 容器,那么您的应用程序中也需要一个 DI 容器,因此您最终会得到两个 DI 容器,这可能会导致各种冲突。在大多数情况下,应用程序中应该只有一个 DI 容器。

最后,你犯了一个经典的新手错误。您将 DI 容器与 DI 本身的概念混淆了。DI 是您设计类的方式,特别是它们如何接受来自对象外部的依赖项。

DI Container 是用于实现 DI 的工具,而不是 DI 本身。

TL;博士

不要将库设计为拥有自己的 DI 容器。

于 2013-03-16T07:56:30.250 回答