MVC3 & StructureMap, вводящий конкретный класс на основе контроллера - PullRequest
1 голос
/ 28 апреля 2011

Скажем, некоторые из моих конструкторов контроллеров используют интерфейс - 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
}

Ответы [ 2 ]

5 голосов
/ 29 апреля 2011

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

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 .

2 голосов
/ 28 апреля 2011

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

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> { ... }
...