C#为什么使用存储库作为属性?

时间:2011-02-25 09:14:30

标签: c# repository

我正在阅读Repository用法。有时我发现存储库是实体的属性。我想知道职业选手和利弊是什么。

public interface IRepository<T>
{
  T GetById(int id);
  void Update(T);
}

public class FooRepository : IRepository<Foo>
{
  public Foo GetById(int i)
  { /* code ..*/ }

  void Update(Foo)
  { /*code..*/ }
}

public class Foo
{
   public IRepository Repository {get;set;}

   public void Update()
   {
     Repository.Update(this);
   }
}

为什么要使用这个apporach?使用存储库和实体对象分离是否更有意义?这样实体对象不知道任何存储库?

编辑:

但是如果你有一个主要对象和不同的子对象呢?

public class MainObject
{
  public int Id {get;set;}

  public List<ISubject> SubObjects {get;}
}

public interface ISubObject
{
}

public class SubObjectA : ISubObject
{
  public string SomeProperty {get;set;}
  public int Id {get;set;}

  public int MainObjectId {get;set;}
}

public class SubObjectB : ISubObject
{
  public string AnotherProperty{get;set;}
  public int Id {get;set;}

  public int MainObjectId {get;set;}
}

因此SubObjectA和SubObjectB是不同的类型,但实现了ISubject接口。主对象具有这些子对象的列表。每个子对象都有自己的存储库。你将如何加载子对象?

3 个答案:

答案 0 :(得分:3)

某些实体实现需要访问创建它们的上下文,以实现延迟加载。请考虑以下事项:

class MyEntity
{
    public virtual IEnumerable<string> Tags { get; private set; }
}

interface IMyEntityRepository
{
    ...
}

您可以从MyEntity实现返回MyEntity的子类,这需要引用创建它的存储库。

internal class MyLazyEntity : MyEntity
{
    public MyLazyEntity(MyLazyEntityRepository repository)
    {
        this.Repository = repository;
    }

    public override IEnumerable<string> Tags
    {
        get
        {
            return this.Repository.LoadTagsForEntityFromXml(this.Id);
        }
    }
}

class MyLazyEntityRepository : IMyEntityRepository { }

我想说,在从实体派生的类中保留对源存储库的引用是好的,另一方面,基本实体类不应该知道存储库。

答案 1 :(得分:1)

我不会使用这种方法。它不是Foo有责任更新自己的存储库的责任。如果你正在应用持久的无知模式。

这段代码很有气味:

   public void Update()
   {
     Repository.Update(this);
   }

除了将调用转发给存储库之外,它什么也没做。

答案 2 :(得分:0)

您可以将其与Spring http://www.springframework.net/

一起使用

或其他依赖注入工具来动态加载对象。只要它实现了接口,它就以相同的方式工作。 Checkout Aspect面向编程。

看看以下帖子

Pros and cons of DDD Repositories