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>();
});
Nguồn
2010-03-04 16:52:25
Chính xác những gì tôi cần, cảm ơn –