c# - How to use Autofac to inject specific implementation in constructor -
i have 2 classes take ilastactivityupdator
constructor parameter: userservice
, anonymoususerservice
.
public anonymoususerservice(ilastactivityupdator lastactivityupdator) { if (lastactivityupdator == null) { throw new argumentnullexception("lastactivityupdator"); } this.lastactivityupdator = lastactivityupdator; }
and similar above userservice
:
public userservice(ilastactivityupdator lastactivityupdator) { if (lastactivityupdator == null) { throw new argumentnullexception("lastactivityupdator"); } this.lastactivityupdator = lastactivityupdator; }
ilastactivityupdator
interface has 1 method: updatelastactivity(int userid)
. there 2 implementations of interface, lastactivityupdator
, decorator called anonymoususerlastactivityupdator
inherits lastactivityupdator
, adds functionality method, so:
public class anonymoususerlastactivityupdator : lastactivityupdator, ianonymoususerlastactivityupdator { public anonymoususerlastactivityupdator() { } public override void updatelastactivity(int userid) { base.updatelastactivity(userid); // functionality } }
i want use autofac wire anonymoususerservice
anonymoususerlastactivityupdator
, userservice
lastactivityupdator
.
what tried add interface decorator derives base interface so:
public interface ianonymoususerlastactivityupdator : ilastactivityupdator { }
then thought use ianonymoususerlastactivityupdator
in anonymoususerservice
constructor , autowired properly.
unfortunately uses first implementation, being ianonymoususerlastactivityupdator
since registered earlier (alphabetical order).
how can accomplish anonymoususerservice
gets anonymoususerlastactivityupdator
injected , userservice
lastactivityupdator
?
autofac nicely documented , looks can find after here. can tell, if have registered updators with
builder.registertype<lastactivityupdator>(); builder.registertype<anonymoususerlastactivityupdator>();
then should able register services with
builder.register(c => new userservice(c.resolve<lastactivityupdator>())); builder.register(c => new anonymoususerservice(c.resolve<anonymoususerlastactivityupdator>()));
or
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>());
then when resolve userservice
or anonymoususerservice
container, correct dependencies.
as aside, if interface injected class, class should function correctly implementations of interface (lsp). class names, looks anonymoususerservice
works anonymoususerlastactivityupdator
, not implementation of ilastactivityupdator
. if case, might appropriate introduce different abstraction (like ianonymoususerlastactivityupdator
) suggested.
Comments
Post a Comment