我有两个将 ILastActivityUpdator
作为构造函数参数的类:UserService
和 AnonymousUserService
。
public AnonymousUserService(ILastActivityUpdator lastActivityUpdator)
{
if (lastActivityUpdator == null)
{
throw new ArgumentNullException("lastActivityUpdator");
}
this.lastActivityUpdator = lastActivityUpdator;
}
与上面的 UserService
类似:
public UserService(ILastActivityUpdator lastActivityUpdator)
{
if (lastActivityUpdator == null)
{
throw new ArgumentNullException("lastActivityUpdator");
}
this.lastActivityUpdator = lastActivityUpdator;
}
ILastActivityUpdator
接口(interface)有一个方法:UpdateLastActivity(int userId)
。该接口(interface)有两个实现,一个是 LastActivityUpdator
,一个是 AnonymousUserLastActivityUpdator
装饰器,它继承自 LastActivityUpdator
并为该方法添加了一些额外的功能,例如所以:
public class AnonymousUserLastActivityUpdator
: LastActivityUpdator, IAnonymousUserLastActivityUpdator
{
public AnonymousUserLastActivityUpdator()
{ }
public override void UpdateLastActivity(int userId)
{
base.UpdateLastActivity(userId);
// Extra functionality
}
}
我现在想使用 Autofac 将 AnonymousUserService
与 AnonymousUserLastActivityUpdator
以及 UserService
与 LastActivityUpdator
连接起来.
我尝试的是为从基本接口(interface)派生的装饰器添加一个接口(interface),如下所示:
public interface IAnonymousUserLastActivityUpdator : ILastActivityUpdator
{ }
然后我想我可以在 AnonymousUserService
构造函数中使用 IAnonymousUserLastActivityUpdator
,一切都会正确地 Autowiring 。
不幸的是,它总是使用第一个实现,即 IAnonymousUserLastActivityUpdator
,因为它注册较早(按字母顺序)。
我怎样才能让 AnonymousUserService
获得 AnonymousUserLastActivityUpdator
注入(inject),而 UserService
获得 LastActivityUpdator
?
最佳答案
Autofac 是 nicely documented看起来你可以找到你想要的here .据我所知,如果您已通过
注册您的更新程序builder.RegisterType<LastActivityUpdator>();
builder.RegisterType<AnonymousUserLastActivityUpdator>();
那么你应该可以注册你的服务了
builder.Register(c => new UserService(c.Resolve<LastActivityUpdator>()));
builder.Register(c => new AnonymousUserService(c.Resolve<AnonymousUserLastActivityUpdator>()));
或
builder.RegisterType<UserService>().WithParameter(
(p, c) => p.ParameterType == typeof(ILastActivityUpdator),
(p, c) => c.Resolve<LastActivityUpdator>());
builder.RegisterType<AnonymousUserService>().WithParameter(
(p, c) => p.ParameterType == typeof(ILastActivityUpdator),
(p, c) => c.Resolve<AnonymousUserLastActivityUpdator>());
然后当您从容器中解析 UserService
或 AnonymousUserService
时,它们将获得正确的依赖项。
顺便说一句,如果一个接口(interface)被注入(inject)到一个类中,那么该类应该与该接口(interface)的所有实现一起正常运行(LSP)。从类名来看,AnonymousUserService
似乎只适用于 AnonymousUserLastActivityUpdator
而不是 ILastActivityUpdator
的任何实现。如果是这种情况,那么按照您的建议引入不同的抽象(如 IAnonymousUserLastActivityUpdator
)可能是合适的。
关于c# - 如何使用Autofac在构造函数中注入(inject)具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835744/