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