我正在阅读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接口。主对象具有这些子对象的列表。每个子对象都有自己的存储库。你将如何加载子对象?
答案 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面向编程。
看看以下帖子