2010-02-25 4 views
2

У меня есть эти регистрации в реестре и я пытаюсь найти правильный способ реализовать их со сканером вместо ручной регистрации.Как написать сканер 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, так как мне использование этого чувствует себя в обратном направлении)

+0

Я не уверен, что вы ищете сканер для вас. Вы хотите, чтобы он добавил все ваши классы просмотра по имени? Как вы вытаскиваете вещи из контейнера? Одна вещь, которая торчит, заключается в том, что вы регистрируете IView для использования HttpContext.Current.CurrentHandler несколько раз. Вы хотели зарегистрировать обрабатываемый тип? – KevM

+0

@KevM Я обновил свой вопрос –

ответ

1

Я надеюсь, что это близко к тому, что вы ищете.

public interface IView { } 
public class View : IView { } 
public class View2 : IView { } 

public static class IckyStaticMonster 
{ 
    public static IView Current { get; set;} 
} 

[TestFixture] 
public class configuring_concrete_types 
{ 
    [Test] 
    public void TEST() 
    { 
     var container = new Container(cfg => 
     { 
      cfg.Scan(scan => 
      { 
       scan.TheCallingAssembly(); 
       scan.Convention<ViewScanner>(); 
      }); 
     }); 

     var current = new View2(); 
     IckyStaticMonster.Current = current; 

     var view2 = container.GetInstance<View2>(); 

     view2.ShouldBeTheSameAs(current); 
    } 
} 

public class ViewScanner : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     Type _pluginType = typeof (IView); 

     if (_pluginType.IsAssignableFrom(type) && _pluginType.IsInterface) 
     { 
      registry.For(type).Use(c=>IckyStaticMonster.Current); 
     } 
    } 
} 
+0

Это похоже на то, что я пытаюсь сделать, мне придется проверить это, и я дам вам знать! –

+0

Это было почти все, но ваш ответ дал мне необходимую мне информацию. –

+0

Рад помочь. Я должен отдать должное Джошу Фланагану, которому он тоже помогал. – KevM

Смежные вопросы