C # Зачем использовать хранилище в качестве свойства? - PullRequest
1 голос
/ 25 февраля 2011

Я читаю при использовании репозитория. Иногда я вижу, что хранилище - это свойство объекта. Мне было интересно, что за и против.

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);
   }
}

Зачем использовать это приложение? Разве не имеет смысла использовать хранилище и разделенный объект сущности? Чтобы объект сущности не знал ни о каких хранилищах?

EDIT:

Но что, если у вас есть один главный объект и разные подобъекты:

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 ]

3 голосов
/ 25 февраля 2011

Некоторым реализациям сущностей требуется доступ к контексту, в котором они созданы, например, для реализации отложенной загрузки. Учтите следующее:

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 голос
/ 25 февраля 2011

Я бы не использовал этот метод.Это не обязанность Foo обновлять себя, это ответственность хранилища.Если вы применяете шаблон постоянного невежества.

Этот код является запахом:

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

Он ничего не делает, кроме переадресации вызова в хранилище.

0 голосов
/ 25 февраля 2011

Вы можете использовать это вместе с Spring http://www.springframework.net/

или другим утилитой внедрения зависимостей для динамической загрузки объектов.Пока он реализует интерфейс, он работает таким же образом.Оформить заказ Аспектно-ориентированное программирование.

Взгляните на следующий пост

Плюсы и минусы хранилищ DDD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...