Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在依赖项注入中为多个接口提供单个实现_C#_Wpf_Dependency Injection - Fatal编程技术网

C# 在依赖项注入中为多个接口提供单个实现

C# 在依赖项注入中为多个接口提供单个实现,c#,wpf,dependency-injection,C#,Wpf,Dependency Injection,我目前正在编写一个WPF应用程序,其中使用依赖项注入 它分为多个项目: WPF应用程序本身 服务接口 上述服务的实施 其他与这个问题无关的东西 现在我有了一个泛型接口,泛型类型是从WPF应用程序传入的。它也是在WPF应用程序中定义的,而不是在其他项目可以访问的库中定义的,因此除了WPF应用程序之外,我不能在其他任何地方访问该类型 我希望能够以一种非通用的方式访问通用接口的服务,但是我该如何做呢 想象一下以下情况: 我的接口定义如下。一个是非泛型基础版本,泛型基础版本仅公开泛型类型的对象 publ

我目前正在编写一个WPF应用程序,其中使用依赖项注入

它分为多个项目:

  • WPF应用程序本身
  • 服务接口
  • 上述服务的实施
  • 其他与这个问题无关的东西
  • 现在我有了一个泛型接口,泛型类型是从WPF应用程序传入的。它也是在WPF应用程序中定义的,而不是在其他项目可以访问的库中定义的,因此除了WPF应用程序之外,我不能在其他任何地方访问该类型

    我希望能够以一种非通用的方式访问通用接口的服务,但是我该如何做呢

    想象一下以下情况:

    我的接口定义如下。一个是非泛型基础版本,泛型基础版本仅公开泛型类型的对象

    public interface IService
    {
        void DoStuff();
    }
    
    public interface IService<T> : IService
    {
        T GenericData { get; }
    }
    
    公共接口iSeries设备
    {
    void DoStuff();
    }
    公共接口iSeries设备:iSeries设备
    {
    T GenericData{get;}
    }
    
    我实现了如下所述的接口:

    public class ServiceImplementation<T> : IService<T>
    {
        public T GenericData { get; }
    
        public void DoStuff() { } // Some irrelevant implementation
    }
    
    公共类服务实现:iSeries设备
    {
    公共T GenericData{get;}
    public void DoStuff(){}//一些不相关的实现
    }
    
    当我将该类型的对象注入WPF应用程序中定义的另一个服务时,我显然可以访问泛型实现,因为我知道泛型类型。但是,当我想访问另一个库中的服务,而我不知道该服务的泛型类型时,我想访问该服务的非泛型版本

    如何确保在作为单例添加到ServiceCollection时为两个接口提供相同的对象

    class WpfOnlyObject
    {
        // Irrelevant stuff
    }
    
    // In the App.xaml.cs
    public void ConfigureServices(ServiceCollection services)
    {
        services.AddSingleton<IService<WpfOnlyObject>, ServiceImplementation<WpfOnlyObject>>();
        services.AddSingleton<IService, ServiceImplementation<WpfOnlyObject>>();
    }
    
    类WpfOnlyObject
    {
    //无关的东西
    }
    //在App.xaml.cs中
    公共void配置服务(ServiceCollection服务)
    {
    services.AddSingleton();
    services.AddSingleton();
    }
    
    如果这个问题已经得到了回答,我真的很抱歉,但我在这里找不到合适的答案。

    根据建议,我做了以下操作,它工作得非常完美

    // taken from the code in the question
    public void ConfigureServices(ServiceCollection services)
    {
        services.AddSingleton<IService<WpfOnlyObject>, ServiceImplementation<WpfOnlyObject>>();
        services.AddSingleton<IService>(serviceProvider => serviceProvider.GetRequiredService<IService<WpfOnlyObject>>());
    }
    
    //摘自问题中的代码
    公共void配置服务(ServiceCollection服务)
    {
    services.AddSingleton();
    services.AddSingleton(serviceProvider=>serviceProvider.GetRequiredService());
    }
    
    IServiceCollection
    在这方面有点弱——您不太可能在ASP.NET之外看到它。我认为您可能必须注册
    IService
    作为从容器中获取
    IService
    的委托