我正在使用在这个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>
)上的方法。通常的方法是什么?
答案 0 :(得分:2)
这里的关键是将Repository<>
仅视为实施细节。您不会直接访问其中的任何方法;相反,您将在界面上公开所有方法,包括Insert
和Delete
:
public interface ICustomerRepository
{
// ...Customer-specific queries...
void Insert(Customer customer);
void Delete(Customer customer);
}
在CustomerRepository
中实施界面时,您只需将Insert
和Delete
来电转至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>();
});