Ответ 1
Вы создаете состав root как одну точку входа для своих разрешений. Вы передаете INjectModule в качестве параметра, чтобы вы могли его конфигурировать, он тестирует по-разному. Одним из преимуществ Root Composition является то, что не все ваши сборки будут зависеть от NInject, и у вас будет одна точка для изменения логики разрешения. Это действительно классный образец, когда вы можете изменить контейнер IoC или ввести какой-то динамический перехват в будущем.
public class CompositionRoot
{
private static IKernel _ninjectKernel;
public static void Wire(INinjectModule module)
{
_ninjectKernel = new StandardKernel(module);
}
public static T Resolve<T>()
{
return _ninjectKernel.Get<T>();
}
}
Ваш модуль будет выглядеть следующим образом
public class ApplicationModule : NinjectModule
{
public override void Load()
{
Bind(typeof(IRepository<>)).To(typeof(GenericRepository<>));
}
}
В основном методе вы передаете ApplicationModule
в качестве параметра и разрешаете Form1
и запустите его.
[STAThread]
static void Main()
{
CompositionRoot.Wire(new ApplicationModule());
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(CompositionRoot.Resolve<Form1>());
}
В конструкторе Form1
вы передаете требуемый репозиторий со специальными закрытыми родовыми параметрами
public partial class Form1 : Form
{
private IRepository<Process> _processRepository;
public Form1(IRepository<Process> productionRepository)
{
this._processRepository = productionRepository;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(_processRepository.ToString());
}
}
Ваши репозитории могут быть очень сложными, но я не буду добавлять к ним никакой функции вместо метода ToString()
, чтобы мы могли видеть, правильно ли была решена зависимость. Обратите внимание, что в репозиториях нет никаких атрибутов.
public interface IRepository<T>
{
}
public class GenericRepository<T> : IRepository<T>
{
public override string ToString()
{
return "MyRepository with type : "+typeof(T).Name;
}
}
Теперь, когда вы запустите приложение, вы увидите, что все подключено, а в окне сообщения отображается закрытый тип как Process