2010-03-04 14 views
8

Tôi hiện đang có một loạt các kho như vậyStructureMap IRegistrationConvention để đăng ký quy ước đặt tên mặc định không?

IMyRepository
IAnotherRepository

Tất cả họ đều kế thừa từ IRepository (nếu điều này giúp)

Làm thế nào tôi có thể nhận được StructureMap sử dụng một máy quét IRegistryConvention đăng ký của tôi các loại bê tông có tên là

SqlMyRepository
SqlAnotherRepository

Trả lời

16

Tôi đã đọc bài viết đó, nhưng nó đã không cho tôi những gì tôi cần. AddAllTypesOf đã đăng ký tất cả các kiểu cụ thể chống lại IRepositoryInterface nhưng thay vào đó tôi yêu cầu mỗi loại cụ thể được đăng ký với giao diện với cách đặt tên tương đương. tức là.

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

Ngoài ra, tôi cần phải tạo một số phiên bản được đặt tên cho kho thử nghiệm.

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

Đây là những gì tôi nghĩ ra có vẻ như hoạt động khi tôi cần.

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

Và thực hiện như sau

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

Chính xác những gì tôi cần, cảm ơn –

1

Kiểm tra http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/create-your-own-auto-registration-convention-with-structuremap.aspx

Đặc biệt, phần này

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

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

      }); 

     }); 

Vì vậy cho bạn, tôi nghĩ rằng một cái gì đó như thế này nên làm việc

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

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

      }); 

     }); 
+0

Cảm ơn, tôi sẽ cho rằng một thử. –

Các vấn đề liên quan