C# 在dotnet的控制器中包含自定义类时调用工厂

C# 在dotnet的控制器中包含自定义类时调用工厂,c#,asp.net,.net-core,C#,Asp.net,.net Core,我有一个web服务(dotnetcore1.1) 我已经创建了一个类,我想通过依赖注入在控制器的构造函数中显示它。这就解决了 Startup.cs有这样的功能 public void ConfigureServices(IServiceCollection services) { // ... stuff ... services.AddSingleton<IMyClassFactory, MyClassFactory>(); } public void配置服务(I

我有一个web服务(dotnetcore1.1)

我已经创建了一个类,我想通过依赖注入在控制器的构造函数中显示它。这就解决了

Startup.cs有这样的功能

public void ConfigureServices(IServiceCollection services)
{
    // ... stuff ...
    services.AddSingleton<IMyClassFactory, MyClassFactory>();
}
public void配置服务(IServiceCollection服务)
{
//…东西。。。
services.AddSingleton();
}
MyController.cs有如下内容:

public MyController(IConfigurationRoot config, ILogger<MyController> logger, IMyClassFactory mcf)
{
    // ... stuff ...

    // Here I can grab "mcf" and grab an instance.  Make a call like this:
    // _myclass = mcf.GetMyClass(this.GetType().Name) 
}
public MyController(IConfigurationRoot配置、ILogger记录器、IMyClassFactory mcf)
{
//…东西。。。
//在这里,我可以抓取“mcf”并抓取一个实例。进行如下调用:
//\u myclass=mcf.GetMyClass(this.GetType().Name)
}
问题是,我希望这种行为更像伊洛格。也就是说,我没有向Startup.cs中的服务集合添加ILogger,但ILogger工厂以某种方式为我的控制器提供了它想要的记录器

我错过了什么?请原谅,我是dotnet的新手。

services.AddSingleton(typeof(IFoo),typeof(fooheloper));
services.AddSingleton(typeof(IFoo<>), typeof(FooHelper<>));
其中:

public interface IFoo<T> where T : class
{
  string Process(T value);
}

public class FooHelper<T> : IFoo<T> where T : class
{
  public string Process(T value)
  {
    return "DepController";
  }
}
公共接口IFoo,其中T:class
{
字符串处理(T值);
}
公共类FooHelper:IFoo其中T:class
{
公共字符串进程(T值)
{
返回“DepController”;
}
}
将允许您使用:

public FooController(IFoo<FooController> helper)
publicfoocontroller(IFoo助手)
这是一个有点模糊的用例,我很少看到它被使用。请注意,您不能使用
services.AddSingleton(typeof(IFoo),(ctx)=>{…})
来指定实现的具体构造方式,因为在这种情况下无法访问t,您只能得到:

System.ArgumentException:开放泛型服务类型“LearnWebApi.Core.IFoo`1[T]”需要注册开放泛型实现类型

如果您想要自定义行为,我相信您的下注选项是将自定义工厂注入控制器,并使用类似以下内容:

IFoo<Thing> _helper;

...

public FooController(FooFactory factory) {
  _helper = factory.Resolve<Thing>();
}
IFoo\u助手;
...
公共食品控制员(食品工厂){
_helper=factory.Resolve();
}