3

我正在尝试在我的 asp.net MVC 项目中使用存储库和工作单元模式,但是我很难弄清楚如何将存储库依赖项传递给工作单元。工作单元的一般标准结构似乎如下:

public class UnitOfWork : IUnitOfWork
 {
        private ICustomerRepository _customerRepository;

        public ICustomerRepository CustomerRepository
        {
            get
            {
                if (this._customerRepository == null)
                {
                    this._customerRepository = new CustomerRepository(someContext);
                }
                return _customerRepository;
            }
        }
}

具体来说,令我困惑的是这一行:

this._customerRepository = new CustomerRepository(someContext);

通过为存储库定义接口,随着时间的推移和业务需求的变化,是否能够将存储库依赖项注入 UoW 的整个想法?如果是这样,为什么我在网上看到的几乎每个实现都执行上述操作?在这个实现中,我们应该如何将一个新的实例传递ICustomerRepository给 UoW?当然,我们还需要更改 UoW 中的代码,这不违反开放关闭原则吗?我将如何将存储库注入我的 UoW?

我环顾四周,这个问题似乎以前被问过,但我仍然很难理解提议的解决方案(门面服务)。

4

1 回答 1

3

有两种常用方法可以获取 CustomerRepository 的实例。第一种方法称为构造函数注入,它是构造函数中的一个简单参数,例如

public class UnitOfWork : IUnitOfWork
{
    public UnitOfWork(ICustomerRepository repository)
    {
        _customerRepository = repository;
    }

    private ICustomerRepository _customerRepository;

    public ICustomerRepository CustomerRepository
    {
        get
        {
            if (this._customerRepository == null)
            {
                throw new ArgumentException("Missing repository");
            }
            return _customerRepository;
        }
    }
}

第二种更灵活的方法是使用 IoC 框架,如 Structuremap、Unity、Ninject 等。

这是一个结构图的例子:

public class UnitOfWork : IUnitOfWork
{
    private ICustomerRepository _customerRepository;

    public ICustomerRepository CustomerRepository
    {
        get
        {
            if (this._customerRepository == null)
            {
                _customerRepository = ObjectFactory.GetInstance<ICustomerRepository>();
            }
            return _customerRepository;
        }
    }
}

另外,您需要一个 configuraiton 类来告诉 Structuremap 要实例化哪个类,它可能看起来像这样:

public static class RepositoryRegistry
{
    internal static void DefaultConfiguration(Registry registry)
    {
       registry.For<ICustomerRepository>().Use<CustomerRepository>();
    }
}
于 2013-01-17T12:32:31.193 回答