我正在尝试为我的课程实现类似Asp Net Core的静态生成器。这就是我在说的。在Asp Net Core应用程序的Startup方法BuildWebHost类WebHost中创建IWebHostBuilder:public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build();我对UseStartup<Startup>()方法感兴趣,所以我想知道这个方法如何“理解”它必须使用的Startup类?该方法的签名是:public static IWebHostBuilder UseStartup<TStartup>(this IWebHostBuilder hostBuilder)where TStartup : class;在我的应用程序中,我想使用类似的方法,例如,在这里,我有一个简单的空接口ICleaner,它由某些Cleaner类实现,然后又有CleanerBuilder类,它负责添加适当的类到一个列表,对其进行配置并在Cleaner方法之后全部运行它们。这是我的CleanerBuilder类。这是我的CleanerBuilder类:public class CleanerBuilder { private List<ICleaner> _activeCleaners { get; set; } private CleanerBuilder() { } public static CleanerBuilder CreateDefaultBuilder(string[] args) { var cleanerBuilder = new CleanerBuilder(); /* * ... */ return cleanerBuilder; } public CleanerBuilder UseCleaner<ICleaner>() { _activeCleaners.Add(???); return this; } public void Build() { foreach(var cleaner in _activeCleaners) { cleaner.Run(); } } }用法是:CleanerBuilder.CreateDefaultBuilder(args) .UseCleaner<TempCleaner>() .Build();现在,我不知道在Build方法中该怎么做。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 最简单的实现可能是这样的: public CleanerBuilder UseCleaner<TCleaner>() where TCleaner : ICleaner, class, new { _activeCleaners.Add(new TCleaner()); return this; }但是,您实际上并没有从中获得任何收益:public CleanerBuilder UseCleaner(ICleaner cleaner){ _activeCleaners.Add(cleaner); return this;}通用版本在此简单版本中受到更多限制,因为它必须具有一个空的构造函数。不酷,也许不是。 Microsoft对它的StartUp所做的就是将其连接到它的依赖项注入容器,并尝试从那里构造它。这就解决了构造函数参数的问题。如果您已将Visual Studio配置为下载源,只需在UseStartup方法上按F12键即可查看它们在其中的作用。或者,您可以在source中查找它。 (adsbygoogle = window.adsbygoogle || []).push({});
10-04 11:39