StructureMap IRegistrationConvention注册非默认命名约定?

时间:2010-03-04 13:45:37

标签: configuration structuremap

我目前有一堆像这样的存储库

IMyRepository
IAnotherRepository

他们都从IRepository继承(如果这有帮助)

如何让structuremap使用IRegistryConvention扫描程序来注册名为

的具体类型

SqlMyRepository
SqlAnotherRepository

2 个答案:

答案 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)

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

特别是这部分

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

            });

        });