2010-03-04 13 views

cevap

16

çalışması gerektiğini düşünüyorum Bana ihtiyacım olan şeyi ver. AddAllTypesOf, tüm beton türlerini IRepositoryInterface'e karşı kaydetmiştir, ancak bunun yerine, her beton tipinin, arabirime karşı, adsız olarak adlandırma ile kaydedilmesini talep ediyorum. ie. Ayrıca, test depoları için bazı adlandırılmış örnekler oluşturmam gerekiyor.

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

İşte buna ihtiyacım olarak çalışmaya göründüğü ile geldi budur.

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); 
    } 
} 

Ve uygulanan

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

Tam olarak ihtiyacım olan şey, teşekkürler –

1

sizin için

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

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

      }); 

     }); 

Yani Özellikle http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/create-your-own-auto-registration-convention-with-structuremap.aspx

, bu bölümü kontrol edin, böyle bir şey o makaleyi okumuştu ama etmedi

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

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

      }); 

     }); 
+0

Teşekkür aşağıdaki gibi, bir denemede da vereceğiz. –

İlgili konular