如果没有看到myObject 的实际用法,很难争论什么是最好的方法。如果所有自定义 AddMyExtension.. 方法都需要它,则可能应该在运行时注入和解析以进行相应的注册。
如果在您的情况下不可能或只是个坏主意,您可以创建一个新接口,其实现基本上是 IServiceCollection 的包装器,并将其用于注册。像这样的东西:
public interface IMyServiceCollection : IServiceCollection
{
public IMyObject MyObject { get; }
}
class MyServiceCollection : IMyServiceCollection
{
private readonly IServiceCollection _serviceCollection;
public IMyObject MyObject { get; }
public MyServiceCollection(IServiceCollection serviceCollection, IMyObject myObject)
{
_serviceCollection = serviceCollection;
MyObject = myObject;
}
public IEnumerator<ServiceDescriptor> GetEnumerator() => _serviceCollection.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_serviceCollection).GetEnumerator();
public void Add(ServiceDescriptor item) => _serviceCollection.Add(item);
public void Clear() => _serviceCollection.Clear();
public bool Contains(ServiceDescriptor item) => _serviceCollection.Contains(item);
public void CopyTo(ServiceDescriptor[] array, int arrayIndex) => _serviceCollection.CopyTo(array, arrayIndex);
// the rest of IServiceCollection delegating implementation ...
}
扩展:
public static class ServicesExts
{
public static IMyServiceCollection WithMyObject(this IServiceCollection services, IMyObject obj) => new MyServiceCollection(services, obj);
}
然后让所有AddMyExtension... 方法接受并返回IMyServiceCollection,调用更改为:
builder.Services
.WithMyObject(myObject)
.AddMyExtension1()
.AddMyExtension2()
...
.AddMyExtensionN();
或具有值元组的类似方法:
public static class ServicesExts
{
public static (IServiceCollection Collection, IMyObject Object) WithMyObject(this IServiceCollection services, IMyObject obj)
=> (services, obj);
}
而AddMyExtension... 有点像:
public static (IServiceCollection Collection, object Object) AddMyExtension(this (IServiceCollection Collection, object Object) tuple)
{
// do the registrations ...
return tuple;
}
用法看起来一样。