2013-07-22 2 views
1

Я просто начать работу с Autofac и у меня есть следующий код:Autofac и WebForms - передача непостоянных параметров, разрешенных параметров?

public class _default : System.Web.UI.Page, IUserInformationProvider 
{ 
    protected void Page_Load(object sender, System.EventArgs e) 
    { 
     ControllerFactory cf; 
     using (scope == ((Global_asax)this.Context.ApplicationInstance).ContainerProvider.ApplicationContainer.BeginLifetimeScope()) { 
      cf = scope.Resolve<IControllerFactory>(); // <-- would love to pass "this" somewhere here, but how??? 
     } 
    } 

} 

ControllerFactory определен ниже, а также принимает интерфейс IUserInformationProvider. Я хотел бы передать экземпляр WebForm в качестве параметра для разрешения IControllerFactory.

public class ControllerFactory : IControllerFactory 
{ 
    protected IUserInformationProvider _userInformation; 
    public ControllerFactory(IUserInformationProvider userInformation) 
    { 
     _userInformation = userInformation; 
    } 
} 

Просматривая документацию, я вижу, что существует 3 типа параметров (Именованные, типизированных, Решенный), но первые 2 принимают только постоянные значения. Кажется, что параметры Resolved - это путь, но я как бы теряюсь в том, как его реализовать, или если это даже правильная стратегия. И как бы выглядел строитель. Режиссер?

ответ

0

Вы можете передать дополнительный параметр не только при регистрации, но и при разрешении типа.

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

Однако вы можете использовать NamedParameter, где вам нужно передать имя параметра, что вы использовали в contrustor так "userInformation" и значение this:

cf = scope.Resolve<IControllerFactory>(
    new NamedParameter("userInformation", this)); 

Или вы можете использовать TypedParameter, где вам нужно пройти тип параметра в этом случае typeof(IUserInformationProvider) и снова величина this:

cf = scope.Resolve<IControllerFactory>(
    new TypedParameter(typeof(IUserInformationProvider), this)); 

Если вы ищете какой-то вообще руководство о том, как вы можете интегрировать WebForms с Autofac вы можете начать с documentation

0

Перерыв цикл зависимости от введения зависимость свойств в контроллере:

public class ControllerFactory : IControllerFactory 
{ 
    public ControllerFactory() { } 

    // Property dependency (part of IControllerFactory interface) 
    public IUserInformationProvider UserInformation { get; set; } 
} 

Таким образом, вы можете установить значение после того, как Autofac построен, что Тип:

var factory = scope.Resolve<IControllerFactory>(); 
factory.UserInformation = this; 
cf = factory; 
+0

Да, но с этим вы превратили 'UserInformation' в необязательной зависимости, и в настоящее время в теории в каждом способе' ControllerFactory', где вы будете использовать 'UserInformation' вам нужно проверить, что Свойс y не 'null' ... – nemesv

Смежные вопросы