c# - How to create a parameterless indexer -


i might have coded myself corner here, hoping there simple way out of it.

my logic layer static singleton instance has lots of properties accessing individual sub-logic layers. of put in place unit testing allow injection of custom repositories , works quite nicely that. boiler plate code each sub-instance repetitive , expect there way simplify it.

below simplified example demonstrate how far have manages , stuck. 1 way works indexer on sub-logic class wrapper sub-logic, reads strangely. other way using random letter property on sub-logic class wrapper sub-logic. reads better, still has ripple effect on existing code.

can done way want to, or should looking @ differently. apologies length of example. tried make simple possible while still keeping concept intact

class program {     static void main(string[] args)     {         var logic = new logic();         // old usage (desired)         var abcs_1 = logic.abcs_1.list();         var defs_1 = logic.defs_1.list();         // new usage (would keep old way)         var abcs_2 = logic.abcs_2[0].list(); // <-- ugly         var defs_2 = logic.defs_2.d.list();  // <-- less ugly, still not pretty         //var abcs_2 = logic.abcs_2.list(); // <-- wanted         //var defs_2 = logic.defs_2.list();  // <-- wanted     } }  public class abc { }  public class def { }  public class abcslogiclayer {     public list<abc> list() { return null; } }  public class defslogiclayer {     public list<def> list() { return null; } }  public class logic {     #region new code. want move towards     public logiclocker<abcslogiclayer> abcs_2 = new logiclocker<abcslogiclayer>();     public logiclocker<defslogiclayer> defs_2 = new logiclocker<defslogiclayer>();      #endregion      #region old code. want move away this.      #region builerplate abcs_1     private abcslogiclayer m_abcs = null;     private readonly object m_abcslock = new object();     public abcslogiclayer abcs_1     {                 {             lock (m_abcslock)             {                 if (m_abcs == null)                 {                     m_abcs = new abcslogiclayer();                 }             }             return m_abcs;         }         set         {             lock (m_abcslock)             {                 m_abcs = value;             }         }     }     #endregion      #region builerplate defs_1     private defslogiclayer m_defs = null;     private readonly object m_defslock = new object();     public defslogiclayer defs_1     {                 {             lock (m_defslock)             {                 if (m_defs == null)                 {                     m_defs = new defslogiclayer();                 }             }             return m_defs;         }         set         {             lock (m_defslock)             {                 m_defs = value;             }         }     }     #endregion      #endregion }  public class logiclocker<t> t : class, new() {     private t logiclayer = null;     private readonly object logiclayerlock = new object();      public t this[int i]     {                 {             lock (logiclayerlock)             {                 if (logiclayer == null)                 {                     logiclayer = new t();                 }             }             return logiclayer;         }         set         {             lock (logiclayerlock)             {                 logiclayer = value;             }         }     }     public t d     {                 {             lock (logiclayerlock)             {                 if (logiclayer == null)                 {                     logiclayer = new t();                 }             }             return logiclayer;         }         set         {             lock (logiclayerlock)             {                 logiclayer = value;             }         }     } } 

you can use interface solve problem: 1) define interface list method:

public interface ilogiclayer<t> {     list<t> list(); } 

2) logic layer class should implement interface:

public class abcslogiclayer:ilogiclayer<abc> 

3) logiclocker should implement interface well

public class logiclocker<t,u> : ilogiclayer<u> t : ilogiclayer<u>, new() 

implementation of list method be:

lock (logiclayerlock) {     if (logiclayer == null)     {          logiclayer = new t();     } } return logiclayer.list(); 

4) instantiate logic locker in logic class

public logiclocker<abcslogiclayer, abc> abcs_2 = new logiclocker<abcslogiclayer,abc>(); public logiclocker<defslogiclayer, def> defs_2 = new logiclocker<defslogiclayer, def>();  

or better make more generics:

public logiclocker<logiclayer<abc>> abcs_2 = new logiclocker<logiclayer<abc>>(); 

but depends on want


Comments

Popular posts from this blog

c# - How to get the current UAC mode -

postgresql - Lazarus + Postgres: incomplete startup packet -

angularjs - ng-repeat duplicating items after page reload -