2010-03-04 1 views
8

я в настоящее время есть куча репозиториев как такStructureMap IRegistrationConvention для регистрации нестандартного соглашения об именах?

IMyRepository
IAnotherRepository

Все они наследуют от IRepository (если это поможет)

Как я могу получить StructureMap использовать сканер IRegistryConvention зарегистрировать мой конкретные типы, которые названы

SqlMyRepository
SqlAnotherRepository

ответ

16

Я прочитал эту статью, но это не так дайте мне то, что мне нужно. AddAllTypesOf зарегистрировал все конкретные типы против IRepositoryInterface, но вместо этого я требую, чтобы каждый конкретный тип регистрировался против интерфейса с равнозначным именованием. т.е.

For<IMyRepository>().Use<SqlMyRepository>(); 

Также мне нужно создать некоторые именованные экземпляры для тестовых репозиториев.

For<IMyRepository>().Use<TestMyRepository>().Named("Test"); 

Вот что я придумал, с которым, как представляется, работает, поскольку мне это нужно.

public class SqlRepositoryConvention : StructureMap.Graph.IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     // only interested in non abstract concrete types that have a matching named interface and start with Sql   
     if (type.IsAbstract || !type.IsClass || type.GetInterface(type.Name.Replace("Sql", "I")) == null) 
      return; 

     // Get interface and register (can use AddType overload method to create named types 
     Type interfaceType = type.GetInterface(type.Name.Replace("Sql","I")); 
     registry.AddType(interfaceType, type); 
    } 
} 

и реализуется следующим образом

Scan(cfg => 
      { 
       cfg.TheCallingAssembly(); 
       cfg.Convention<SqlRepositoryConvention>(); 
      }); 
+1

То, что мне нужно, спасибо –

1

Проверьте http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/create-your-own-auto-registration-convention-with-structuremap.aspx

В частности, эта часть

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

       o.TheCallingAssembly(); 
       o.AddAllTypesOf<IController>().NameBy(type => type.Name.Replace("Controller", "")); 

      }); 

     }); 

Так что для вас, я думаю, что-то, как это должно работать

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

       o.TheCallingAssembly(); 
       o.AddAllTypesOf<IRepository>().NameBy(type => type.Name.Replace("I", "Sql")); 

      }); 

     }); 
+0

Спасибо, я дам, что попробовать. –

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