存储库模式和模型关系及依赖注入

时间:2015-01-12 13:10:21

标签: c# sharepoint dependency-injection repository-pattern

我对使用存储库模式非常陌生,我正在努力在使用存储库时如何在我的模型中实现关系。例如,我有以下两个存储库接口:IPersonRepositoryIAddressRepository

public interface IPersonRepository
{
    IList<Person> GetAll();
    Person GetById(int id);
}

public interface IAddressRepository
{
    IList<Address> GetAll();
    Address GetById(int id);
    Address GetByPerson(Person person);
}

两个模型类:PersonAddress

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方法有Address之类的方法,我会将GetPersons()注入{{1}}对象吗?我之所以这样问,是因为我正在重构一些代码以使用存储库模式,并希望利用依赖注入来准备它以便以后更好地测试。

此外:我没有使用任何ORM,因为我在SharePoint环境中开发,并且我使用SharePoint列表作为域模型的实际数据存储。

1 个答案:

答案 0 :(得分:0)

如果我自己这样做,我不会将存储库注入您的模型。

相反,在地址模型上,我会有一个personId字段,或者如果您在每个地址跟踪多个人,则会有一个personIds集合。

执行此操作,您可以在名为GetByPersonId(int personId)的地址存储库中创建一个方法,然后通过检查该人员的ID是否与该地址上的id或该ID上的id集合匹配来获取该人员的地址。地址包含传入的personId。