【发布时间】:2015-01-12 21:18:45
【问题描述】:
我对存储库模式的使用非常陌生,并且我正在努力在使用存储库时如何在我的模型中实现关系。例如,我有以下两个存储库接口:IPersonRepository 和 IAddressRepository
public interface IPersonRepository
{
IList<Person> GetAll();
Person GetById(int id);
}
public interface IAddressRepository
{
IList<Address> GetAll();
Address GetById(int id);
Address GetByPerson(Person person);
}
还有两个模型类:Person 和 Address
public class Person
{
private IAddressRepository _addressRepository;
public string FirstName { get; set; }
public string LastName { get; set; }
private Address _address;
public Address Address
{
get { return _addressRepository.GetByPerson(this); }
set { _address = value; }
}
Person(string firstName, string lastName, IAddressRepository addressRepository)
{
this.FirstName = firstName;
this.LastName = lastName;
this._addressRepository = addressRepository;
}
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string Zip { get; set; }
public List<Person> Persons { get; set; }
Address(string street, string city, string zip)
{
this.Street = street;
this.City = city;
this.Zip = zip;
}
}
所以现在我的问题是:将IAddressRepository 注入Person 类并通过从实际Person 对象中的getter 延迟加载来请求实际地址是否可以?另外,如果IPersonRepository 具有GetPersons() 之类的方法,我会将IPersonRepository 注入到Address 对象中吗?我问这个是因为我正在重构一些代码以使用存储库模式,并希望利用依赖注入来准备它以便在以后更好地测试。
另外:我在 SharePoint 环境中开发时没有使用任何 ORM,而是使用 SharePoint 列表作为域模型的实际数据存储。
【问题讨论】:
-
在对象本身中引用存储库似乎非常奇怪。这样做的原因是什么?
-
好吧,我想我只是不知道如何做得更好。 :) 在支持从数据存储延迟加载的同时,您将如何建立与
Address的关系? -
您正在尝试做 EF 已经为您做的事情。 EF 生成代理类以注入额外的代码以在延迟加载的情况下使用。查看 this 文章,看看它是否对您有帮助。
标签: c# sharepoint dependency-injection repository-pattern