WPF中的自定义IServiceProvider

Mik*_*ard 14 wpf

是否可以IServiceProvider在WPF中添加自定义以用于标记扩展?
我没有找到任何相关的文档或示例.

Tor*_*tad 1

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