这对某些人来说可能很明显,但是......有没有办法用 LightInject 解决非注册类型?此外,在没有显式注入的情况下使用 DI 框架自动神奇地解析对象以提高可读性是一种好习惯吗?
在我的示例中,我将超级全功能框架(可能是最慢的)与最轻量(和最快)的框架之一进行比较。这不完全是一个错误:D
构造函数注入(无容器)
private static void ComposeObjects()
{
var repository = new CSVRepository();
var viewModel = new PeopleViewerViewModel(repository);
Application.Current.MainWindow = new PeopleViewerWindow(viewModel);
}
忍者
private void ConfigureContainer()
{
Container = new StandardKernel();
Container.Bind<IPersonRepository>().To<CSVRepository>()
.InSingletonScope();
}
private void ComposeObjects()
{
Application.Current.MainWindow = Container.Get<PeopleViewerWindow>();
}
统一
private void ConfigureContainer()
{
Container = new UnityContainer();
Container.RegisterType<IPersonRepository, CSVRepository>(
new ContainerControlledLifetimeManager());
}
private void ComposeObjects()
{
Application.Current.MainWindow = Container.Resolve<PeopleViewerWindow>();
}
光注入
private void ConfigureContainer()
{
Container = new ServiceContainer();
Container.Register<IPersonRepository, CSVRepository>(
new PerContainerLifetime());
// Do we need to explicitly register PeopleViewerWindow with LightInject?
Container.Register<PeopleViewerWindow>(
factory =>
new PeopleViewerWindow(new PeopleViewerViewModel
(Container.GetInstance<IPersonRepository>()))
);
}
private void ComposeObjects()
{
Application.Current.MainWindow = Container.GetInstance<PeopleViewerWindow>();
}