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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -