1

我正在尝试将 SharpRepository 项目配置为也使用 SimpleInjector IOC 框架作为框架中的 IOC 选项,但我坚持移植一些代码。无法弄清楚如何使用 SimpleInjector 传入 <> 通用接口。

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

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);
    });
}
4

1 回答 1

1

Simple Injector 中最接近的内容如下:

 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<,,>));
于 2013-12-23T06:27:44.460 回答