【发布时间】:2014-12-15 13:51:13
【问题描述】:
我想在 WCF 服务中使用 autofac(使用 Autofac.Integration.Web)来解决对 wcf 通道的依赖。我正在尝试的是这样的
全球.asax
protected void Application_Start(object sender, EventArgs e)
{
var builder = new ContainerBuilder();
builder.RegisterType<CheckingService>();
builder.Register(c => new ChannelFactory<IAuthenticationService>(
new WSHttpBinding("wsHttpBinding_Common"),
new EndpointAddress(ConfigurationManager.AppSettings["AuthenticationServiceUrl"])).CreateChannel())
.SingleInstance();
AutofacHostFactory.Container = builder.Build();
}
使用频道的类:
public AuthorizationManager(IAuthenticationService authenticationServiceClient)
{
AuthenticationServiceClient = authenticationServiceClient;
}
但我得到了
Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.
当我尝试使用 WCF 测试客户端时。
但是,如果我只是在客户端不抱怨的方法中新建通道:
所以我的理解是我在绑定中做错了,但不确定是什么。
public AuthorizationManager()
{
AuthenticationServiceClient = new ChannelFactory<IAuthenticationService>(
new WSHttpBinding("wsHttpBinding_Common"),
new EndpointAddress(ConfigurationManager.AppSettings["AuthenticationServiceUrl"])).CreateChannel();
}
所以,如果我错了,请纠正我,问题应该出在绑定上,但我不知道我做错了什么。
谢谢
更新
ResourceServiceAuthorizationManager 以 nuget 包的形式出现
public class ResourceServiceAuthorizationManager : ServiceAuthorizationManager
{
public ResourceServiceAuthorizationManager();
public IAuthenticationService AuthenticationServiceClient { get; set; }
public Guid ResourceId { get; set; }
public override bool CheckAccess(OperationContext operationContext);
}
【问题讨论】:
-
我怀疑您正在尝试对您的 wcf 服务实施某些特定授权?如果是这样,为什么不使用会员提供者来实现呢?
-
我们有自己的服务,我们通过一个 nuget 包拉入,经过一些检查后会返回一个声明。我们使用 ninject 服务定位器注入 channelfactory,但随后我们需要在我们尝试访问的 Wcf 服务中使用 Ninject。现在我已经从身份验证服务中删除了 ninject,因此我必须满足它对通道的依赖(实际上不需要通过工厂本身)。不确定我是否在一条评论中正确解释了它
-
我不确定我是否理解正确,但我认为您的意思是:您制作了一个依赖于 ninject 的可重用包。现在您从可重用包中删除了 ninject 并让依赖注入从可重用包外部完成?
-
在我们使用 Ninject 从可重用包外部注入,然后在其中使用 ServiceLocator 之前。现在,我从包中删除了 DI,因此我需要将通道作为参数传递。我正在尝试在外面使用 DI。检查我的更新
标签: c# wcf dependency-injection autofac