.net core Prism能否使用.NET Core';什么是内置依赖注入?
我想使用.NET Core 3.1启动一个WPF应用程序.net core Prism能否使用.NET Core';什么是内置依赖注入?,.net-core,prism,.net Core,Prism,我想使用.NET Core 3.1启动一个WPF应用程序 Prism是否可以使用.NETCore的内置DI(IServiceCollection),或者我是否必须使用Unity之类的工具? 如果Prism不能使用内置DI,它们可以并排存在吗 我必须使用像Unity这样的东西吗 ServiceCollection是“类似于统一的东西”。是的,您可以将其与prism一起使用: 创建一个IContainerExtension实现,该实现重定向到ServiceCollection 从prismaplic
Prism是否可以使用.NETCore的内置DI(
IServiceCollection
),或者我是否必须使用Unity之类的工具?
如果Prism不能使用内置DI,它们可以并排存在吗 我必须使用像Unity这样的东西吗
ServiceCollection
是“类似于统一的东西”。是的,您可以将其与prism一起使用:
IContainerExtension
实现,该实现重定向到ServiceCollection
prismaplicationbase
派生并从CreateContainerExtension
servicecolection
的IContainerExtension
实现,但按照开发人员自己的话来说,这更多的是一个概念证明,而不是一个可行的解决方案
如果Prism不能使用内置DI,它们可以并排存在吗
是的,他们可以。需要注意的是,您不能简单地在servicecolection
中注册服务,并期望能够将该服务直接注入到您的应用程序、模块和ViewModels中。这将失败,因为这些文件由Prism框架管理,因此注入将仅适用于使用IContainerRegistry
接口注册的服务
利益
你为什么要这么做?作为内置物联网容器,ServiceCollection
API是众所周知的,因此对于.Net开发人员来说,它将更简单。此外,您可以构造非WPF项目,以使用默认容器注册服务,从而允许它们与桌面项目完全解耦。这对于更复杂的体系结构(如域驱动设计)非常有用
让我们考虑下面的项目结构:
solution
-- Desktop // Prism WPF application, containing only views and models
-- Application // Class library, containing operational logic.
假设作为应用程序项目的一部分,您需要一个IUserService
,它保存当前用户的信息,当用户在桌面应用程序中进行身份验证时,必须在内存中填充这些信息。注册方法如下所示:
public IServiceCollection AddServices(this IServiceCollection services)
{
services.AddSingleton<IUserService, UserService>()
}
IUserService
位置。在本例中,我将使用棱镜模块:
public class Module : IModule
{
private readonly IUserService userService;
public Module(IServiceProvider serviceProvider)
{
this.userService = serviceProvider.GetService<IUserService>();
}
...
private void Authenticate()
{
this.userService.IsAuthenticated = true;
}
}
IHttpClient
,则需要为iAuthorizationService
提供HttpAuthorizationService
实现,而不是DesktopAuthorizationService
本质上,我们用一个与DryIot兼容的工厂(接受DryIot容器的实例)包装原始工厂方法,该工厂可以为原始工厂提供IServiceProvider
实例
Microsoft.Extensions.DependencyInjection
protected override void RegisterTypes(IContainerRegistry container)
{
// Build service provider using the ServiceCollection API
var provider = new ServiceCollection()
.AddServices()
.BuildServiceProvider();
// Register IServiceProvider within DryIot and provide
// a factory method to retrieve the service instance
container.Register<IServiceProvider>(() => provider);
}
protected override void RegisterTypes(IContainerRegistry container)
{
var services = new ServiceCollection().AddServices()
foreach (var service in services)
{
Adapter.Register(container, service);
}
}
IUserService
:
public class Module : IModule
{
private readonly IUserService userService;
public Module(IUserService userService)
{
this.userService = userService;
}
}
public class Module : IModule
{
private readonly IUserService userService;
public Module(IUserService userService)
{
this.userService = userService;
}
}