1

有没有办法扩展现有的绑定语法(例如扩展方法),让我们有这样的东西:

Bind<IRepository>().ToProvider<MyProvider<MyRepository>>().WhenCustom<SomeType>()
4

2 回答 2

2

编写一个扩展方法IBindingWhenSyntax<T>并使用现有的When重载来实现你的逻辑:

class BindingWhenExtensions
{
   public IBindingInNamedWithOrOnSyntax<T> WhenCustom<T>(
       this IBindingWhenSyntax<T> syntax)
   { 
        return syntax.When(r => true); 
   }
}
于 2012-04-19T12:59:50.333 回答
0

重新构建您想要创建具有类似于以下签名的扩展的问题(以与您的评论保持一致);

public static IBindingInNamedWithOrOnSyntax<T> WhenCustom<TParent>(
            this IBindingWhenSyntax<T> binding)

据我所知,我们不能像使用 Ninject 那样干净地扩展,因为正如您正确提到的,T这里是在我们的扩展不知道的接口上定义的。

所以我们的扩展签名必须是;

public static IBindingInNamedWithOrOnSyntax<T> WhenCustom<T>(
            this IBindingWhenSyntax<T> binding)

在这一点上,我看到我们能够成功传递的唯一方法TParent是删除泛型参数并将其作为标准类型参数传递(或传递多种类型);

 public static IBindingInNamedWithOrOnSyntax<T> WhenCustom(
            this IBindingWhenSyntax<T> binding, params Type[] parents)

这还是和 Ninjects 自己的绑定语法方法一致;

/// <summary>
/// Indicates that the binding should be used only for injections on the specified types.
/// Types that derive from one of the specified types are considered as valid targets.
/// Should match at lease one of the targets.
/// </summary>
/// <param name="parents">The types to match.</param>
/// <returns>The fluent syntax.</returns>
IBindingInNamedWithOrOnSyntax<T> WhenInjectedInto(params Type[] parents);

不幸的是,我们没有使用“纯”泛型进行扩展的奢侈。

于 2017-09-21T08:02:37.077 回答