gpt4 book ai didi

dependency-injection - LightInject 与(Ninject 和 Unity)未注册类型解析

转载 作者:行者123 更新时间:2023-12-01 23:54:04 25 4
gpt4 key购买 nike

这对某些人来说可能是显而易见的,但是......有没有办法用 LightInject 解析未注册的类型?此外,在不显式注入(inject)可读性的情况下,使用 DI 框架自动神奇地解析对象是否是一种好习惯?

在我的示例中,我将 super 全功能框架(并且可能是最慢的)与最轻(也是最快)的框架之一进行比较。那不完全是一个错误 :D

构造函数注入(inject)(无容器)

    private static void ComposeObjects()
{
var repository = new CSVRepository();
var viewModel = new PeopleViewerViewModel(repository);
Application.Current.MainWindow = new PeopleViewerWindow(viewModel);
}

注入(inject)

    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>();
}

光注入(inject)

    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>();
}

最佳答案

LightInject 可以使用 RegisterFallback 方法解析未注册到容器的服务。

var container = new ServiceContainer();
container.RegisterFallback((type, s) => true, request => new Foo());
var foo = container.GetInstance<IFoo>();

RegisterFallback 方法的第一个参数可以决定服务是否可以“延迟解析”。第二个参数是一个 ServiceRequest 实例,它提供请求的服务类型和服务名称。

文档已使用此信息更新。 http://www.lightinject.net/

更新

根据您的示例代码,我怀疑您正试图克服 LightInject 不会自动解析未知具体类型这一事实。

对于您当前的情况,我认为最好扫描程序集并搜索从特定类型继承的具体类型。例如,从某种 View 模型基类继承的类。

看看来自 LightInject.WebApi 的这段代码,它使用类似的方法来注册 Controller 。

public static void RegisterApiControllers(this IServiceRegistry serviceRegistry, params Assembly[] assemblies)
{
foreach (var assembly in assemblies)
{
var controllerTypes = assembly.GetTypes().Where(t => !t.IsAbstract && typeof(IHttpController).IsAssignableFrom(t));
foreach (var controllerType in controllerTypes)
{
serviceRegistry.Register(controllerType, new PerRequestLifeTime());
}
}
}

最好的问候

伯恩哈德·里希特(LightInject 的作者)

关于dependency-injection - LightInject 与(Ninject 和 Unity)未注册类型解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25048139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com