Давайте начнем с 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);