Ответ 1
В переменной pop3
будет указана та же ссылка на объект IPopClient
, который имеет popClient
, поэтому, когда оператор using
завершен, объект, на который ссылаются как локальная, так и переменная экземпляра, будет Dispose() d, возможно, помещая его в несогласованное состояние для дальнейшего использования.
Если вы хотите использовать несколько экземпляров IPopClient
, по одному на вызов Fetch()
, вам следует ввести "factory метод":
public class MyProvider
{
private readonly Func<IPopClient> createPopClient;
public MyProvider(Func<IPopClient> popClientFactory)
{
this.createPopClient = popClientFactory;
}
public void Fetch()
{
using (var pop3 = createPopClient())
{
....
}
}
}
Теперь, когда вы вызываете Fetch()
, он выполнит метод factory, который вернет новую ссылку на IPopClient
, которая может быть использована, а затем удалена без какого-либо другого вызова этого метода.
AutoFac поддерживает внедрение методов factory для зарегистрированных типов без какой-либо дополнительной настройки (отсюда и название, я думаю); Я считаю, что при настройке контейнера Ninject вам необходимо явно зарегистрировать "getter" как метод factory для заданного типа возврата (который может быть таким же простым, как lambda ()=>new PopClient()
, или он может использовать вызов разрешения контейнера метод).