假设我有一个服务,我想要将其解析为作用域生命周期。但是有时我尝试将其解析为接口类型,有时又尝试解析为实现类型。
我尝试做的第一件事是这样的:
ServiceCollection services;
services.AddScoped<MyClass>();
services.AddScoped<IMyInterface, MyClass>();
上面示例的问题在于,如果我解析IMyInterface,然后解析MyClass,则使用不同的实例。基本上,有可能同时存在2个作用域实例。
我通过以下方式解决了这个问题。但这种方法非常容易出错,因为您很容易忘记在某个地方执行此操作,并且很难注意到。
serviceCollection.AddScoped<MyClass>();
serviceCollection.AddScoped<IMyInterface, MyClass>(sp => sp.GetRequiredService<MyClass>());
有没有一种更容易避免错误的方法来实现我想要的目标。最好是在单个注册中完成,但不一定必须如此。
例如,作为xUnit测试:
public class Tests
{
[Fact]
public void ReturnsSameInstanceForImplementationAndServiceType()
{
var serviceCollection = new ServiceCollection();
// TODO: Change these lines so they're less error prone.
serviceCollection.AddScoped<MyClass>();
serviceCollection.AddScoped<IMyInterface, MyClass>(sp => sp.GetRequiredService<MyClass>());
var services = serviceCollection.BuildServiceProvider();
var myInt = services.GetRequiredService<IMyInterface>();
var myCls = services.GetRequiredService<MyClass>();
Assert.Equal(myCls, myInt);
}
class MyClass : IMyInterface { }
interface IMyInterface { }
}