我试图将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);
});
}
答案 0 :(得分: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<,,>));