Вот типичный пример. Вам необходимо войти в свое приложение. Но во время разработки вы не уверены, хочет ли клиент регистрироваться в базе данных, файлах или журнале событий.
Итак, вы хотите использовать DI, чтобы отложить этот выбор до того, который может быть настроен клиентом.
Это какой-то псевдокод (примерно на основе Unity):
Вы создаете интерфейс регистрации:
public interface ILog
{
void Log(string text);
}
затем используйте этот интерфейс в ваших классах
public class SomeClass
{
[Dependency]
public ILog Log {get;set;}
}
внедрить эти зависимости во время выполнения
public class SomeClassFactory
{
public SomeClass Create()
{
var result = new SomeClass();
DependencyInjector.Inject(result);
return result;
}
}
и экземпляр настроен в app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name ="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
</typeAliases>
<containers>
<container>
<types>
<type type="MyAssembly.ILog,MyAssembly"
mapTo="MyImplementations.SqlLog, MyImplementations">
<lifetime type="singleton"/>
</type>
</types>
</container>
</containers>
</unity>
</configuration>
Теперь, если вы хотите изменить тип регистратора, просто зайдите в конфигурацию и укажите другой тип.