2013-12-22 25 views
1

我想配置SharpRepository项目也使用SimpleInjector IOC框架作为框架中的IOC选项,但我坚持移植一些代码。无法弄清楚如何使用SimpleInjector传入<>通用接口。在Simple Injector中绑定一个开放的泛型类型到一个方法

第二个问题/问题是如何使用简单的注入器将泛型参数传递到上下文中。

public static void BindSharpRepository(this IKernel kernel, 
    ISharpRepositoryConfiguration configuration) 
{ 
    kernel.Bind(typeof (IRepository<>)).ToMethod(context => 
    { 
     var genericArgs = context.Request.Service.GetGenericArguments(); 
     return RepositoryFactory.GetInstance(genericArgs[0], configuration); 
    }); 

    kernel.Bind(typeof(IRepository<,>)).ToMethod(context => 
    { 
     var genericArgs = context.Request.Service.GetGenericArguments(); 
     return RepositoryFactory.GetInstance(genericArgs[0], 
      genericArgs[1], configuration); 
    }); 

    kernel.Bind(typeof(ICompoundKeyRepository<,,>)).ToMethod(context => 
    { 
     var genericArgs = context.Request.Service.GetGenericArguments(); 
     return RepositoryFactory.GetInstance(genericArgs[0], genericArgs[1], 
      genericArgs[2], configuration); 
    }); 
} 

回答

1

自带的简单注射器最接近的事情是:

container.ResolveUnregisteredType += (s, e) => 
{ 
     Type type = e.UnregisteredServiceType; 
     if (type.IsGenericType && 
      type.GetGenericTypeDefinition() == typeof(IRepository<>)) 
     { 
      var args = type.GetGenericArguments(); 

      e.Register(() => RepositoryFactory.GetInstance(args[0], configuration)); 
     } 
}; 

另一种选择是移动存储库的创建出RepositoryFactory类(如果可能的话)的。这可能使它更容易,因为在这种情况下,你可以简化注册于以下内容:

// using SimpleInjector.Extensions; 
container.RegisterOpenGeneric(typeof(IRepository<>), typeof(GenericRepository<>)); 
container.RegisterOpenGeneric(typeof(IRepository<,>), typeof(GenericRepository<,>)); 
container.RegisterOpenGeneric(typeof(ICompoundKeyRepository<,,>), 
    typeof(GenericCompoundKeyRepository<,,>)); 
+0

在创建的typeof(ConfigurationBasedRepository <>)而不是使用RepositoryFactory你可以使用第二种方法。 –

+0

'ConfigurationBasedRepository <>'具有多个构造函数,它们具有基本类型。最好的方法是使用一个(默认)构造函数在组合根中创建派生类,然后注册该类型。 – Steven

相关问题