Как зарегистрировать класс по соглашению, который реализует два интерфейса? - PullRequest
0 голосов
/ 07 февраля 2019

Допустим, у меня есть класс, который реализует IFoo и IBar.Я хочу зарегистрировать класс по соглашению в Unity, чтобы я мог внедрить его через IFoo или IBar.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 09 февраля 2019

Давайте начнем с unity без использования соглашения.В этом случае вы хотите зарегистрировать реализацию и связать ее с несколькими interface, вы, вероятно, сделаете что-то вроде этого:

container.Register(typeof(BarFoo), lifetime);
container.Register(typeof(IBar), typeof(BarFoo));
container.Register(typeof(IFoo), typeof(BarFoo));

Точки, использующие соглашение, заключаются в архивировании чего-то подобного.Пример действительно упрощен и пытается указать, что должно быть сделано.Предполагается, что типом является BarFoo, но, как правило, типом является каждый тип, определенный в сборке, поэтому для обнаружения нескольких реализаций interface должна быть применена дополнительная логика.

container.RegisterTypes(
    AllClasses.FromAssemblies(Assembly.Load("AssemblyName")),
    type => new[] { typeof(BarFoo), typeof(IFoo), typeof(IBar) },
    WithName.Default,
    WithLifetime.Hierarchical);

Смысл заключается в регистрацииСама реализация рядом с interface, тогда interface будет сопоставлена ​​с реализацией.Если вы не зарегистрируете реализацию, то каждый интерфейс будет привязан к отдельному экземпляру реализации.ИМО это не имеет смысла с TransiendLifetime ... однако, у вас есть возможность настроить время жизни для каждого типа.


nb Просто как демонстрация того, как это может быть реализовано

container.RegisterTypes(
    AllClasses.FromAssemblies(Assembly.Load("AssemblyName")),
    type => 
    {
        var types = WithMappings.FromAllInterfaces(type).ToList();
        if(!type.IsAbstract && type.GetInterfaces().Count() > 1) //more than one interface
        {
            types.Add(type);
        }
        return types;
    },
    WithName.Default,
    WithLifetime.Hierarchical);
...