我有一家工厂可以创建通用服务:
public static class AdPersisterFactory<TEntity>
where TEntity : AdBase
{
public static AdPersister<TEntity> Create(ApplicationDbContext dbContext)
{
AdRepository<TEntity> adRepository = new AdRepository<TEntity>(dbContext);
IAdImagePersister s3AdImagePersister = new S3AdImagePersister();
AdPersister<TEntity> adPersister = new AdPersister<TEntity>(adRepository, s3AdImagePersister);
return adPersister;
}
}
我想使用ninject(版本3),如何将IAdPersister
绑定到上述工厂创建的实例...这是我的DI代码:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
// I have tried the following which does not compile
// kernel.Bind(typeof(IAdPersister<>)).ToMethod(ctx => AdPersisterFactory<>.Create(new ApplicationDbContext()));
}
这是针对ASp.NET MVC应用程序的,因此理想情况下,我不想使用新的ApplicationDbContext
,而是使用ApplicationDbContext
中存在的相同的RequestScope
。
我也看过Ninject.Extensions.Factory,但我不确定在这种情况下如何/是否可以使用它。
如果您愿意重构为更坚实的方法,并且AdRepository<TEntity>
具有类似的支持界面,则>]
public class AdRepository<TEntity> : IAdRepository<TEntity> where TEntity : AdBase { public AdRepository(ApplicationDbContext dbContext) { //... } }
并假设...
public class AdPersister<TEntity> : IAdPersister<TEntity> where TEntity : AdBase { public AdPersister(IAdRepository<TEntity> adRepository, IAdImagePersister imagePersister) { //... } //... }
然后创建开放式通用依赖项的方法如下
private static void RegisterServices(IKernel kernel) { kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope(); kernel.Bind<IAdImagePersister>().To<S3AdImagePersister>(); //Open generic bind for repository and ad persister kernel.Bind(typeof(IAdRepository<>)).To(typeof(AdRepository<>)); kernel.Bind(typeof(IAdPersister<>)).To(typeof(AdPersister<>)); }
现在需要持久化的地方,只需将封闭类型注入为
ctor(IAdPersister<Foo> fooPersister)
并且必要的依赖关系将由容器解决并注入。
确实不需要那个静态工厂。