Autofac не передает тот же экземпляр разрешенным аргументам в конструкторе - PullRequest
1 голос
/ 27 июля 2010

У меня есть следующая настройка

public class CommonClass : ICommonClass
{
}

public class SomeClass : ISomeClass
{
   public SomeClass(ICommonClass common, IOtherClass otherClass) {}
}

public class OtherClass : IOtherClass
{
  public OtherClass(ICommonClass common) {}
}

//Registration
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();
builder.RegisterType<SomeClass>().As<ISomeClass>().InstancePerDependency();
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();

Мне бы хотелось, чтобы общий аргумент в каждом конструкторе был одним и тем же экземпляром, но чтобы он создавал новый экземпляр ICommon при разрешении SomeClass.Как я могу получить это время случиться.Я попытался зарегистрировать их как InstancePerLifetimeScope, но они действовали так же, как SingleInstance.

Ответы [ 2 ]

0 голосов
/ 28 июля 2010

Вы можете создать отдельную именованную регистрацию ICommonClass и использовать ее только при разрешении SomeClass:

// Existing registration
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();

// One-off registration
builder
    .RegisterType<CommonClass>()
    .As<ICommonClass>()
    .InstancePerLifetimeScope()
    .Named<ICommonClass>("OneOffCommonClass");

// New registrations of dependents
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();

builder
    .Register(c => new SomeClass(
        c.Resolve<ICommonClass>("OneOffCommonClass"),
        c.Resolve<IOtherClass>()))
    .As<ISomeClass>()
    .InstancePerDependency();
0 голосов
/ 28 июля 2010

InstancePerDependency - это путь, когда вам нужны новые экземпляры для каждой зависимости.Теперь иметь разные времена жизни для разных зависимых классов сложно и неправильно.Если вы можете уточнить, почему вам нужно такое поведение, возможно, можно найти лучший способ.

Тем не менее, чтобы выполнить то, что вы просите (хотя мне это не нравится;), вы можете использовать «владельца экземпляра»,Я думаю, что для регулярных зависимостей новые общие экземпляры будут обслуживаться как обычно.Но для особого случая SomeClass общий экземпляр выбирается из этого класса-держателя, который всегда обслуживает один и тот же экземпляр:

public class CommonHolder
{
    public ICommonClass Instance {get;private set;}
    public CommonHolder(ICommonClass commonInstance)
    {
        Instance = commonInstance;
    }
}

, а затем настройки регистрации:

builder.RegisterType<CommonHolder>().SingleInstance();
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();

builder.RegisterType<SomeClass>().InstancePerDependency();
builder.Register(c =>
    c.Resolve<SomeClass>(TypedParameter.From(c.Resolve<CommonHolder>().Instance)))
    .As<ISomeClass>().InstancePerDependency();
...