我目前有一堆像这样的存储库
IMyRepository
IAnotherRepository
他们都从IRepository继承(如果这有帮助)
如何让structuremap使用IRegistryConvention扫描程序来注册名为
的具体类型 SqlMyRepository
SqlAnotherRepository
答案 0 :(得分: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)
特别是这部分
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"));
});
});