2016-02-19 2 views
0

Как выполнить параметр разрешения, если это тип действия?Как разрешить параметр действия с помощью Autofac

public class TaskWrapper : ITaskWrapper 
{ 
    public TaskWrapper(Action action) 
    { 
     this.action = action; 
    } 
} 

public void Connect() 
{ 
    Program.Container.Resolve<TaskWrapper>(new NamedParameter("action", ToConnect)); // not work! 
    Program.Container.Resolve<TaskWrapper>(new TypedParameter(typeof(Action), ToConnect)); // not work! 
} 

private void ToConnect() 
{ 
    // some code... 
} 

NamedParameter и TypedParameter не работает

ответ

1

Прежде всего, вы не должны подвергать контейнер, как вы делаете с вашим Program.Container собственности, и решить свою зависимость. Это классический пример Service Locator, и он считается анти-шаблоном. Но если вам действительно нужно или хотите, чтобы сделать это, ваш код должен выглядеть следующим образом:

public void Connect() 
{ 
    Action action = Connect; 
    Program.Container.Resolve<ITaskWrapper>(new NamedParameter("action", action)); 
} 

Гораздо лучше было бы использовать инъекции зависимостей, как это действительно необходимо использовать - для введения зависимостей.

public class Connector : IConnector 
{ 
    public Connector(Func<Action, ITaskWrapper> taskWrapperFactory) 
    { 
     var taskWrapper = taskWrapperFactory(Connect); 
    } 

    private void Connect() 
    {    
    } 
} 

public class TaskWrapper : ITaskWrapper 
{ 
    private readonly Action _task; 

    public TaskWrapper(Action task) 
    { 
     _task = task; 
    } 
} 

Вы можете переместить свои методы соединения, связанные с каким-то классом, как Connector, и ввести свой TaskWrapper в конструкторе. Использование Func<> позволяет создавать экземпляры и передавать неразрешимые параметры.

Кроме того, вы должны разрешать/вводить ваши зависимости, используя правильные интерфейсы, а не типы напрямую, так как полностью теряете всю идею слабосвязанных компонентов.

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