WindowsForm中具有UnitOfWork和存储库模式的DI使用Autofac

时间:2018-07-07 10:20:53

标签: c# .net dependency-injection autofac

我在构建项目WindowsForm应用程序依赖注入时遇到问题。 这是我在Program.cs文件中的代码。

        var builder = new ContainerBuilder();
        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
        // Register your Web API controllers.
        //builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
        builder.RegisterType<DbFactory>().As<IDbFactory>().InstancePerRequest();

        builder.RegisterType<DITestDbContext>().AsSelf().InstancePerRequest();
        //builder.Register(c => app.GetDataProtectionProvider()).InstancePerRequest();

        // Repositories
        builder.RegisterAssemblyTypes(typeof(ProductCategoryRepository).Assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces().InstancePerRequest();

        // Services
        builder.RegisterAssemblyTypes(typeof(ProductCategoryService).Assembly)
           .Where(t => t.Name.EndsWith("Service"))
           .AsImplementedInterfaces().InstancePerRequest();

        Autofac.IContainer container = builder.Build();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(container.Resolve<Form1>());

        `

这是我在Form1.cs中的代码

private IProductCategoryService productCategoryService;
    private IUnitOfWork unitOfWork;
    public Form1(IProductCategoryService productCategoryService, IUnitOfWork unitOfWork)
    {
        this.productCategoryService = productCategoryService;
        this.unitOfWork = unitOfWork;
        InitializeComponent();
    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        LoadProductCategory();
    }

    private void LoadProductCategory()
    {
        var data = productCategoryService.GetAll();
        gridControl1.DataSource = data;
    }

我得到了错误

  

DependencyResolutionException:无法解析类型'DITest.Service.ProductCategoryService',因为无法找到其所属的生存期范围。此注册提供以下服务:   -DITest.Service.IProductCategoryService'

我认为启动Form1时出错。有人可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您收到此错误,是因为您在Windows窗体应用程序中使用InstancePerRequestInstancePerRequest供Web应用程序使用,它允许每个Web请求具有一个实例。

为了使您的应用程序正常运行,只需删除InstancePerRequest。如果未指定范围, Autofac 将使用InstancePerDependency范围。

您可以在文档中找到有关范围的更多信息:Instance scope