StructureMap和自动注册

时间:2012-08-21 14:11:53

标签: asp.net-mvc-4 structuremap

我有3个项目:

Core(包含存储库,服务等的域模型和接口) Repository(存储库的具体实现)
Web(MVC 4项目)。

Inside ObjectFactory.Initialize我有这样的东西:

For<IFooRepository>().Use<FooRepository>();
For<IBooRepository>().Use<BooRepository>();
...

假设我有50个存储库,这是否意味着我必须编写50行代码(每个具体实现一行)?可以StructureMap以某种方式找出FooRepository实现IFooRepositor接口并在请求IFooRepository接口时实例化该类吗?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

StructureMap允许您通过扫描程序集并应用约定将接口连接到类型来以编程方式执行此操作。这是一个例子:

public class RepositoryRegistry : StructureMap.Configuration.DSL.Registry
{
    public RepositoryRegistry()
    {
        Scan(s =>
        {
            s.AssemblyContainingType<ApplicationRepository>();
            s.Convention<TypeNamingConvention>();
        });
    }
}

public class TypeNamingConvention : IRegistrationConvention
{
    public void Process(Type type, Registry registry)
    {
        Type interfaceType = type.GetInterfaces()
            .ToList()
            .Where(t => t.Name.ToLowerInvariant().Contains("i" + type.Name.ToLowerInvariant()))
            .FirstOrDefault();

        if (interfaceType != null)
        {
            registry.AddType(interfaceType, type);
        }
    }
}   

并在初始化时调用注册表,如下所示:

ObjectFactory.Initialize(x => x.Scan(s =>
{
 s.TheCallingAssembly();
 s.LookForRegistries();
}));

此约定假定您的类型与接口+“I”匹配的标准。希望这能让你继续下去。