ProvideValue 方法允许您重写任何您希望克服重写 IServiceProvider 的缺点的逻辑。我还没有尝试下面的代码,相反,它是我们如何设计自定义服务提供程序的草图,最好是作为单例和通常添加到依赖倒置框架中的其他功能。由于使用了框架/库,您应该使用解决方案中自然可用的 IServiceProvider,或者您自己添加 DI 框架来注册接口和具体类型。
MarkupExtension 需要重写 ProvideValue。您可以忽略此处的 IServiceProvider 参数,而是使用您自己可以控制的东西(即另一个 IServiceProvider)
public override object ProvideValue(IServiceProvider
serviceProvider)
{
//retrieve objects from a custom IServiceProvider instead
var someService = someCustomServiceProvider.GetSomeInstance<ISomeService();
//use someService to do desired functionality and finally return the object to return in the ProvideValue method here.
}
Run Code Online (Sandbox Code Playgroud)
如果我们有一些服务提供商,我们自己实施:
public class SomeCustomServiceProvider : IServiceProvider {
private readonly Dictionary<T, Func<T>> _registry;
public SomeCustomServiceProvider(){
_registry = new Dictionary<T, Func<T>>();
}
public void RegisterService<T>(Func<T> createFunc){
_registry[T] = createFunc;
}
public override object GetService(Type serviceType) {
return _registry[T]();
}
}
Run Code Online (Sandbox Code Playgroud)
不要自己编写小型 DI 框架,而是使用您已经使用的 DI 框架,例如 Autofac 或类似框架,或者使用简单的容器注册表。这样的小框架有很多,我只是在这里添加了一个示例作为说明。SimpleInjector 就是 DI 框架的一个示例: SimpleInjector
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |