MVC3

#c# #asp.net-mvc-3 #structuremap

#c# #asp.net-mvc-3 #structuremap

Вопрос:

Скажем, несколько конструкторов моих контроллеров используют интерфейс — IPetInterface, существует 3 конкретные реализации IPetInterface.

Как бы вы настроили StructureMap для предоставления одной из конкретных реализаций на основе контроллера, которому это необходимо.

грубый пример ….

 class DogStuff: IPetInterface{}

class CatStuff: IPetInterface{}

class GiraffeStuff: IPetInterface{}

class DogController : Controller
{
    DogController(IPetInterface petStuff)

    // some other stuff that is very unique to dogs
}

class CatController : Controller
{
    CatController(IPetInterface petStuff)

    // some other stuff that is very unquie to cats
}
  

Комментарии:

1. Хотя я уверен, что это можно сделать с помощью StructureMap (я сам больше сторонник Unity, поэтому я не уверен точно, как это сделать с помощью StructureMap), вы уверены, что ваш дизайн правильный? Основываясь на вашем описании, кажется, что интерфейс может быть слишком общим….

2. @BFree: Возможно, это слишком обобщенно. В настоящее время у меня есть отдельные интерфейсы для каждого «питомца», но они идентичны, поэтому мне интересно, возможно ли это / стоит того

Ответ №1:

С классами и интерфейсами, предоставленными в вопросе, эта регистрация будет делать:

 For<DogController>().Use<DogController>()
  .Ctor<IPetInterface>("petStuff").Is<DogStuff>();
For<CatController>().Use<CatController>()
  .Ctor<IPetInterface>("petStuff").Is<CatStuff>();
For<GiraffeController>().Use<GiraffeController>()
  .Ctor<IPetInterface>("petStuff").Is<GiraffeStuff>();
  

Если это превысит 3 регистрации с одним и тем же шаблоном, я бы рассмотрел возможность использования регистрации на основе соглашения, которая автоматически регистрировала бы соответствующий «материал» для каждого контроллера на основе именования. Этого можно было бы достичь с помощью IRegistrationConvention.

Комментарии:

1. Спасибо, именно такая информация мне была нужна!

Ответ №2:

Попробуйте это:

 class Stuff<T> : IPetInterface<T> where T : IPet { ... }

interface IPetInterface<T> where T : IPet { ... }

abstract class PetController<T> : Controller where T : IPet
{
    protected PetController<T>(IPetInterface<T> stuff)
    { ... }
}

class CatController : PetController<Cat>
{
    public CatController(IPetInterface<Cat> stuff) : base(stuff) {}

    ...
}

class DogController : PetController<Dog> { ... }