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
Post a Comment