【问题标题】:Autofac With WCF Not Working带有 WCF 的 Autofac 不工作
【发布时间】:2015-01-01 01:47:02
【问题描述】:

我正在尝试在 WCF 中实现 Autofac,但它不起作用。

步骤:1

protected void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();

        // Register your service implementations.
        builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>();
        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
        builder.RegisterType<ProjectRepository>().As<IProjectRepository>();
        builder.RegisterType<ProjectService>().As<IProjectService>();
        builder.RegisterType<DataService>().As<IDataService>();
        builder.Register(c => new ProjectRepository(c.Resolve<DatabaseFactory>())).AsSelf();
        builder.Register(c => new ProjectService(c.Resolve<ProjectRepository>(),c.Resolve<UnitOfWork>())).AsSelf();
        builder.Register(c => new DataService(c.Resolve<ProjectService>())).AsSelf();
        //builder.RegisterType<DataService>().As<IDataService>();
        // Set the dependency resolver.
        var container = builder.Build();
        AutofacHostFactory.Container = container;
    }

步骤:2

public class DataService : IDataService
    {
        private IProjectService projectService;

        public DataService(IProjectService projectService)
        {
            this.projectService = projectService;
        }

        public List<Data.Project> GetProjects()
        {
            return projectService.GetAllProject();
        }
    }

在 WCF 启动时显示错误

提供的服务类型无法作为服务加载,因为它 没有默认(无参数)构造函数。修复 问题,给类型添加一个默认构造函数,或者传递一个实例 主机的类型。

块引用

我错过了什么?

如果我用 0 参数实现构造函数,那么 "projectService.GetAllProject(); " projectService 对象在

中显示为空
public List<Data.Project> GetProjects()
        {
            return projectService.GetAllProject();
        }

谢谢, 帕尔甘

【问题讨论】:

标签: wcf inversion-of-control autofac


【解决方案1】:

为了使 Autofac 能够在服务激活过程中使用,您需要更改为使用 AutofacServiceHostFactory。根据您用于注册服务的方法,有不同的方法来执行此操作。

如果您使用的是 .svc 文件,则需要执行以下操作:

<%@ ServiceHost
Service="MyServices.MyService, MyServices"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>

如果您改为通过&lt;system.serviceModel&gt;&lt;serviceHostingEnvironment&gt;&lt;serviceActivations&gt; 使用基于配置的方法,则改为:

<add service="MyServices.MyService, MyServices" relativeAddress="~/MyService.svc" factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" />

完成此操作后,Autofac 现在将负责实例化您的服务实例,并将通过您通过 AutofacHostFactory.Container 配置的容器解析它们来实现。

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多