Прежде всего, вы не должны подвергать контейнер, как вы делаете с вашим 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<>
позволяет создавать экземпляры и передавать неразрешимые параметры.
Кроме того, вы должны разрешать/вводить ваши зависимости, используя правильные интерфейсы, а не типы напрямую, так как полностью теряете всю идею слабосвязанных компонентов.