c# - Dependency Injection for concrete .Net classes -


what preferred way injecting/isolating classes sealed in dlls , not implement interfaces?

we use ninject.

let's have class "server" , want inject/isolate class tcpserver "server" uses.

don't want specific because want know best way, let's that:

public class server  {     iserver _server;     public server(iserver server)      {          _server = server;     }      public void dosomething()     {         _server.dosomething();          } } 

_server should injected with, let's say, tcpclient or mock in case of testing

if tcpserver sealed , implements no interfaces, still want decouple client particular implementation, you'll have define interface client can talk to, adapter tcpserver new interface.

it can tempting extract interface concrete class, don't this. creates semantic coupling between interface , concrete class, , you'll end breaking liskov substitution principle.

instead, define interface in terms of client needs. follows dependency inversion principle; appp, chapter 11 explains: "clients [...] own abstract interfaces". role interface best.

so if client needs dosomething method, that's add interface:

public interface iserver {     void dosomething(); } 

you can inject iserver client, using constructor injection:

public class client  {     private readonly iserver server;      public client(iserver server)      {         if (server == null)             throw new argumentnullexception("server");          this.server = server;     }      public void dofoo()     {         this.server.dosomething();          } } 

when comes tcpserver, can create adapter on it:

public class tcpserveradapter : iserver {     private readonly tcpserver imp;      public tcpserveradapter(tcpserver imp)     {         if (imp == null)             throw new argumentnullexception("imp");          this.imp = imp;     }      public void dosomething()     {         this.imp.dowhatever();     } } 

notice methods don't have have same names (or exact same signatures) in order adapted.


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 -