StructureMap IRegistrationConvention для регистрации соглашения о присвоении имен по умолчанию? - PullRequest
8 голосов
/ 04 марта 2010

У меня в настоящее время есть куча репозиториев, таких как

IMyRepository
IAnotherRepository

Все они наследуются от IRepository (если это помогает)

Как я могу заставить Structuremap использовать сканер IRegistryConvention для регистрации моих конкретных типов с именем

SqlMyRepository
SqlAnotherRepository

Ответы [ 2 ]

16 голосов
/ 04 марта 2010

Я читал эту статью, но она не дала мне того, что мне было нужно. 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 голос
/ 04 марта 2010

Выезд 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"));

            });

        });
...