У меня есть эти регистрации в реестре и я пытаюсь найти правильный способ реализовать их со сканером вместо ручной регистрации.Как написать сканер StructureMap для этого случая
For<ISomeView>.Use(HttpContext.Current.CurrentHandler)
For<IOtherView>.Use(HttpContext.Current.CurrentHandler)
For<IAnotherView>.Use(HttpContext.Current.CurrentHandler)
И так далее. У меня когда-либо был один из моих интерфейсов, присущий IView
, который будет использоваться в качестве интерфейса маркера.
Моя первоначальная попытка вышла глядя, как этот
public void Process(Type type, Registry registry)
{
Type _pluginType = typeof(IView);
if (type.CanBeCastTo(_pluginType) && type.IsInterface)
{
string name = type.Name;
registry.AddType(_pluginType, type, name);
registry.For(_pluginType).Use(HttpContext.Current.CurrentHandler);
}
}
Однако это вызвало мои физические страницы ASP.NET должен быть зарегистрирован как сам вместо этого. Это то, что я получил от WhatDoIHave()
the_page_aspx (ASP.the_page_aspx) - 36d0cdb2-7118-4a1d-94a0-8de1b5ddc357 -
Configured Instance of ASP.the_page_aspx, App_Web_4q8pukge, Version...
Edit: Чтобы ответить на комментарий KevM, что я хочу для того чтобы достигнуть в любое время StructureMap нужно вводить какой-либо одной моей IView так, что это решает ее, возвращая HttpContext.Current.CurrentHandler
Так что, если я бы назвал ObjectFactory.Resolve<ISomeView>()
я хотел бы получить (ISomeView)HttpContext.Current.CurrentHandler
Если у меня есть конструктор, который был SomePresenter(IListView listView, IEditView editView)
, что те будут решены к (IListView)HttpContext.Current.CurrentHandler
и (IEditView)HttpContext.Current.CurrentHandler
.
Я мог бы сделать это с помощью многочисленных операторов For<>.Use()
, как в моем примере, что означает, что я смогу добиться этого с помощью сканера, вместо того, чтобы явно регистрировать каждый из них вручную. Мои интерфейсы всегда будут называться I_____View, если соглашение об именах поможет записать сканер. Я просто не уверен, что мне нужно использовать в выражении if, которое у меня выше для метода Process()
.
Update: С ответом от @KevM он указал мне в правильном направлении к этому
public class ViewScanner : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (type.IsA<IView>() && !type.IsConcrete())
{
registry.For(type).Use(c => HttpContext.Current.CurrentHandler);
}
}
}
< (Isa> это просто расширение для IsAssignableFrom, так как мне использование этого чувствует себя в обратном направлении)
Я не уверен, что вы ищете сканер для вас. Вы хотите, чтобы он добавил все ваши классы просмотра по имени? Как вы вытаскиваете вещи из контейнера? Одна вещь, которая торчит, заключается в том, что вы регистрируете IView для использования HttpContext.Current.CurrentHandler несколько раз. Вы хотели зарегистрировать обрабатываемый тип? – KevM
@KevM Я обновил свой вопрос –