Зависимости, ожидающие удовлетворения - PullRequest
3 голосов
/ 24 июня 2011

Я пытаюсь абстрагировать некоторые простые задачи для некоторых очень простых объектов.

В моей модели предметной области есть ряд различных объектов, которые в основном служат для маркировки (классификации) «Программы». Бизнес-логика говорит, что программа может иметь столько их, сколько нужно, но никакие теги одного типа (например, «County») не могут иметь одно и то же имя, и вы не можете удалить тег, если у него есть программы, связанные с это.

Это построено на MVC3 с S # arp 2.0.

Модель предметной области имеет абстрактный базовый класс NamedEntity : Entity, который определяет public string Name { get; set; } среди других свойств.

Определенные типы расширяют этот класс, добавляя все, что делает их уникальными (если вообще что-либо), например, Тема, которая является иерархической структурой и поэтому имеет дополнительные свойства для этого.

Я хотел создать INamedEntityTasks<T> where T: NamedEntity, а затем иметь базовую версию этого для обработки рутинных задач, таких как bool CheckForDuplicateName(string Name), которые запускали бы доступ к его объекту INamedEntityQueries<T> и вызывали T FindByName(string Name)

Если подклассу необходимо добавить дополнительные правила перед удалением (например, тема с потомками не может быть удалена), то он просто переопределяет виртуальный метод из базового класса.

Структура:

  • MyProject.Infrastructure имеет INamedEntityQueries<T> и NamedEntityQueries<T>, а также ITopicQueries : INamedEntityQueries<Topic> и TopicQueries: NamedEntityQueries<T>, ITopicQueries
  • MyProject.Domain.Contracts.Tasks имеет INamedEntityTasks<T> и ITopicTasks : INamedEntityTasks<Topic>
  • MyProject.Tasks имеет NamedEntityTasks<T> и TopicTasks: NamedEntityTasks<Topic>, ITopicTasks

Мой TopicsController не будет работать из-за отсутствующей зависимости , которую я не могу понять.

Точное исключение:

Невозможно создать компонент 'MyProject.web.mvc.controllers.topicscontroller' поскольку у него есть зависимости, чтобы быть довольный. MyProject.web.mvc.controllers.topicscontroller ждет следующего зависимости:

Услуги: - MyProject.Infrastructure.Queries.ITopicQueries который не был зарегистрирован. - MyProject.Domain.Contracts.Tasks.ITopicTasks который был зарегистрирован, но также жду зависимости.

MyProject.Tasks.TopicTasks ждет для следующих зависимостей:

Услуги: - MyProject.Infrastructure.Queries.INamedEntityQueries`1 [[MyProject.Domain.Topic, MyProject.Domain, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = ноль]] который не был зарегистрирован.

Я проверил container в ComponentRegistrar с точкой останова, и она показывает 3 потенциально неправильно настроенных:

"MyProject.Tasks.NamedEntityTasks`1" NamedEntityTasks`1
"MyProject.Tasks.TopicTasks" ITopicTasks / TopicTasks
"MyProject.web.mvc.controllers.topicscontroller" TopicsController`TopicsController`

Буду признателен за любую помощь.

1 Ответ

2 голосов
/ 27 июня 2011

Вам не нужен интерфейс IFooTasks, просто используйте абстрактный базовый класс, тогда IFooBarTasks и IFooBazTasks будут зарегистрированы в Castle Windsor стандартным ComponentRegistrar в S # arp Architecture:

public abstract class Foo
{
  public void Foo1();

  public void Foo2();
}

public class FooBar : Foo
{
  public void FooBar1();
}

public class FooBaz : Foo
{
  public void FooBaz1();
}

public interface IFooTasks
{
  void Foo1();

  void Foo2();
}

public interface IFooBarTasks : IFooTasks
{
  void FooBar1();
}

public interface IFooBazTasks : IFooTasks
{
  void FooBaz1();
}

public abstract class FooTasks : IFooTasks
{
  public void Foo1()
  {
    // Foo1 implementation
  }

  public void Foo2()
  {
    // Foo2 implementation
  }
}

public class FooBarTasks : FooTasks, IFooBarTasks
{
  public void FooBar1()
  {
    // FooBar1 implementation
  }
}

public class FooBazTasks : FooTasks, IFooBazTasks
{
  public void FooBaz1()
  {
    // FooBaz1 implementation
  }
}
...