我应该如何使用IoC DI与此存储库模式?

时间:2010-11-30 09:56:35

标签: design-patterns ioc-container repository-pattern

我正在使用在这个SO问题的答案中找到的存储库模式:

Advantage of creating a generic repository vs. specific repository for each object?

即,每个存储库都继承自一个抽象基类,该抽象基类包含添加,删除等通用方法,并且还为该存储库/实体所独有的任何方法实现特定的存储库接口。

public class CompanyRepository : Repository<Company>, ICompanyRepository {
...
}

在我的业务层中,我使用Structure Map来获取存储库的实例,但我不确定如何使用它。

 // Structure Map initialisation
 ObjectFactory.Initialize(
 x =>
 {                    
      x.For<ICompanyRepository>().Use<CompanyRepository>();
 });

解析实例:

return ObjectFactory.GetInstance<ICompanyRepository>();

然而,我得到的实例是一个接口而不是整个存储库实现。我无权访问基类(Repository<Company>)上的方法。通常的方法是什么?

2 个答案:

答案 0 :(得分:2)

这里的关键是将Repository<>仅视为实施细节。您不会直接访问其中的任何方法;相反,您将在界面上公开所有方法,包括InsertDelete

public interface ICustomerRepository
{
    // ...Customer-specific queries...

    void Insert(Customer customer);

    void Delete(Customer customer);
}

CustomerRepository中实施界面时,您只需将InsertDelete来电转至Repository<>的受保护方法,如原始问题中所述

您在问题中陈述的StructureMap注册正是我所期望的。 Repository<>的目的是帮助实现特定于实体的接口。请记住,接口将始终包含存储库的完整公共API,并且应该指向正确的方向。

答案 1 :(得分:1)

为什么不

return ObjectFactory.GetInstance<Repository<Company>>;

?您必须相应地修改ObjectFactory初始化:

// Structure Map initialisation
ObjectFactory.Initialize(
    x => {                    
      x.For<Repository<Company>>().Use<CompanyRepository>();
    });

修改
如果您仍想为Repository<Company>获取ICompanyRepository,则需要声明转发:

// Structure Map initialisation
ObjectFactory.Initialize(
    x => {                    
      x.For<Repository<Company>>().Use<CompanyRepository>();
      x.Forward<Repository<Company>, ICompanyRepository>();
    });