gpt4 book ai didi

c# - 在 dotnet 的 Controller 中包含自定义类时调用工厂

转载 作者:行者123 更新时间:2023-11-30 12:39:25 25 4
gpt4 key购买 nike

我有一个网络服务 (dotnet core 1.1)。

我已经创建了一个类,我想通过依赖注入(inject)在我的 Controller 的构造函数中显示它。这解决了...

Startup.cs 有这样的东西......

public void ConfigureServices(IServiceCollection services)
{
// ... stuff ...
services.AddSingleton<IMyClassFactory, MyClassFactory>();
}

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

问题是,我希望行为更像 ILogger。也就是说,我没有将 ILogger 添加到 Startup.cs 中的服务集合,但 ILoggerFactory 以某种方式为我的 Controller 提供了它想要的记录器。

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

最佳答案

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";
}
}

会让你使用:

public FooController(IFoo<FooController> helper)

这是一个有点晦涩的用例,我很少看到它被使用。请注意,您不能使用 services.AddSingleton(typeof(IFoo<>), (ctx) => { ... })指定实现的构造方式,因为在这种情况下无法访问 T,您将得到:

System.ArgumentException: Open generic service type 'LearnWebApi.Core.IFoo`1[T]' requires registering an open generic implementation type.

如果你想要自定义行为,我相信你的选择是将自定义工厂注入(inject) Controller 并使用类似的东西:

IFoo<Thing> _helper;

...

public FooController(FooFactory factory) {
_helper = factory.Resolve<Thing>();
}

关于c# - 在 dotnet 的 Controller 中包含自定义类时调用工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724512/

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