如何使用工厂实例化接口

问题描述 投票:1回答:1

我有一家工厂可以创建通用服务:

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,但我不确定在这种情况下如何/是否可以使用它。

c# asp.net-mvc dependency-injection ninject
1个回答
1
投票

如果您愿意重构为更坚实的方法,并且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)

并且必要的依赖关系将由容器解决并注入。

确实不需要那个静态工厂。

© www.soinside.com 2019 - 2024. All rights reserved.