【发布时间】:2018-10-24 03:35:25
【问题描述】:
最近我不得不利用 Autofac 支持的上下文绑定,但不知何故在 ASP.NET Core 2.0 中它不起作用。我按照How do I pick a service implementation by context? FAQ 页面上的示例(选项 2 和 3)进行操作,但是我设法使其仅在 ASP.NET MVC 5 和 ASP.NET WEB API 2 项目中工作。 示例:
public interface ISender
{
void Send(Destination dest, Content content);
}
// We can implement the interface for different
// "sending strategies":
public class PostalServiceSender : ISender { ... }
public class EmailNotifier : ISender { ... }
public class ShippingProcessor
{
public ShippingProcessor(ISender shippingStrategy) { ... }
}
public class CustomerNotifier
{
public CustomerNotifier(ISender notificationStrategy) { ... }
}
以下绑定配置失败工作:
var builder = new ContainerBuilder();
builder.RegisterType<PostalServiceSender>()
.As<ISender>()
.AsSelf();
builder.RegisterType<EmailNotifier>()
.As<ISender>()
.AsSelf()
.InstancePerLifetimeScope();
builder.RegisterType<DefaultSender>()
.As<ISender>()
.InstancePerLifetimeScope();
builder.RegisterType<ShippingController>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.Resolve<PostalServiceSender>()))
.InstancePerLifetimeScope();
builder.RegisterType<CustomersController>();
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.Resolve<EmailNotifier>()))
.InstancePerLifetimeScope();
var container = builder.Build();
从上述绑定配置中可以看出 DefaultSender 类是 ISender 的默认实现。只有 PostalServiceSender 和 CustomerNotifier 配置为接收不同的 ISender 实现。 不幸的是,在任何请求 ISender 的地方都会传递 DefaultSender 实现。 有没有人在 .NET Core 2.0 中遇到过这种行为?
【问题讨论】:
-
您的意思是
ShippingController正在接收DefaultSender而不是预期的PostalServiceSender吗?你能分享这个控制器的构造函数吗? -
没关系。它也可能与此有关:autofac.readthedocs.io/en/latest/integration/…
标签: c# asp.net-core-mvc autofac asp.net-core-2.0 asp.net-core-webapi