<ItemGroup>
<Reference Include="core">
<HintPath>..\Common\core.dll</HintPath>
</Reference>
<Reference Include="scopes">
<HintPath>..\Common\scopes.dll</HintPath>
</Reference>
</ItemGroup>
using App; для подключения IoC в cs файлах, using App.Scopes; для подключения скоупов.Предположим, что есть класс EmptyCommand:
class EmptyCommand : ICommand
{
public void Execute()
{
}
}
Необходимо зарегистрировать зависимость, при разрешении которой можно было бы получить экземпляр данного класса.
Для регистрации зависимости следует:
Поскольку у нас будет много команд, то желательно выбирать такие имена зависимостям, которые можно было бы легко определить без чтения дополнительной документации.
У нас многие команды имеют вид Что-то + суффикс Command. Давайте выберем
в качестве имени зависимости строку такого вида: "Commands." + "Что-то".
Например, для EmptyCommand можно выбрать имя зависимости: "Commands.Empty"
Стратегия должна иметь тип Func<object[], object>, то есть принимать на вход массив объектов типа object - это исходные данные для разрешения зависимости, и возвращать объект типа object.
Для EmptyCommand нам никакие исходные данные не нужны, поэтому массив object[] в стратегии мы использовать не будем и можно написать такую стратегию:
(object[] _) => new EmptyCommand()
Заметим, что EmptyCommand не имеет состояния, а значит нет смысла создавать несколько экземпляров. Значит перепишем стратегию так, чтобы она всегда возращала ссылку на один и тот же экземпляр EmptyCommand:
var emptyCommandInstance = new EmptyCommand();
(object[] _) => emptyCommandInstance;
Мы определили имя зависимости и стратегию для ее разрешения. Теперь зарегистрируем эту зависимость в нашем IoC контейнере.
Для этого IoC поддерживает зависимость "IoC.Register", для разрешения необходимо указать два параметра:
var registerDependencyCommand = Ioc.Resolve<ICommand>(
"IoC.Register",
@Имя зависимости@,
@Стратегия разрешения зависимости@
);
При разрешении этой зависимости мы получим Команду типа ICommand. Для того, чтобы завивисимость была зарегистрирована необходимо вызвать метод void Execute() этой команды:
registerDependencyCommand.Execute()
Соберем весь код вместе:
var emptyCommand = new EmptyCommand();
var registerDependencyCommand = Ioc.Resolve<ICommand>(
"IoC.Register",
"Commands.Empty",
(object[] args) => emptyCommand
);
registerDependencyCommand.Execute();
Теперь, когда у нас есть зарегистрированная зависимость, ее можно разрешать явно, обращаясь к IoС контейнеру:
var cmd = Ioc.Resolve<ICommand>("Commands.Empty");