Vorige week kwam ik deze post tegen waar een generic class factory wordt gepresenteerd: http://aabs.wordpress.com...c-class-factory-for-c-30/
Voorheen maakte de schrijver voor iedere klasse een stuk code als deze:
Dit heeft hij nu vervangen met een generieke klasse als deze:
Een stuk compacter en natuurlijk generiek.
In z'n uitleg geeft hij nog enkele voorbeelden over gebruik en wat er mogelijk is, maar er is 1 ding wat ik niet helemaal begrijp.
In het eerste voorbeeld wordt er expliciet gekeken of er wordt getest, zo ja, dan wordt er (mogelijk) een ander object terug gestuurd. Dit is niet zo in het 2e voorbeeld, de generieke oplossing.
Volgens mij moet er nog iets worden toegevoegd voor het gebruik binnen unit tests, om zo een gemockt object terug te kunnen geven.
Nu ik deze post hier schrijf besef ik me ineens dat dit mogelijk al is geimplementeerd door middel van de Dispatcher te kunnen setten:
Is dat inderdaad het geval? Wordt hier de dispatcher geset, zodat je met bijvoorbeeld unit tests je gemockte MyClass2 terug krijgt?
Zit ik nog wel met het vraagstuk, blijft de Dispatcher voor de betreffende interface altijd gelden? Volgens mij zou ik in m'n TestMethod dan de Dispatcher moeten vullen met een mock object, maar pas in de te testen methode wordt het object gemaakt. Wellicht omdat er hier static methoden worden gebruikt dat hij dan 'onthoudt' dat je een MyClass2 terug wilt krijgen, maar dat weet ik niet 100% zeker.
Als deze class factory werkt zoals ik denk dat hij werkt, dan lijkt me dit een redelijk chique methode om alles te implementeren.
Voorheen maakte de schrijver voor iedere klasse een stuk code als deze:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class MyClassClassFactory { public class Environment { public static bool InUnitTest { get; set; } public static IMyClass ObjectToDispense { get; set; } } public static IMyClass CreateInstance() { if (Environment.InUnitTest) return Environment.ObjectToDispense; return new MyClass() as IMyClass; } } |
Dit heeft hij nu vervangen met een generieke klasse als deze:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| public static class GenericClassFactory<I, C> where C : I { public static Func<object[], I> Dispenser { get; set; } public static I CreateInstance(params object[] args) { if (Dispenser != null) return Dispenser(args); return (I) Activator.CreateInstance(typeof (C), args); } } |
Een stuk compacter en natuurlijk generiek.
In z'n uitleg geeft hij nog enkele voorbeelden over gebruik en wat er mogelijk is, maar er is 1 ding wat ik niet helemaal begrijp.
In het eerste voorbeeld wordt er expliciet gekeken of er wordt getest, zo ja, dan wordt er (mogelijk) een ander object terug gestuurd. Dit is niet zo in het 2e voorbeeld, de generieke oplossing.
Volgens mij moet er nog iets worden toegevoegd voor het gebruik binnen unit tests, om zo een gemockt object terug te kunnen geven.
Nu ik deze post hier schrijf besef ik me ineens dat dit mogelijk al is geimplementeerd door middel van de Dispatcher te kunnen setten:
C#:
1
2
3
| GenericClassFactory<IMyClass, MyClass>.Dispenser = (args) => (IMyClass)Activator.CreateInstance(typeof(MyClass2), args); IMyClass ad = GenericClassFactory<IMyClass, MyClass>.CreateInstance(1, 2, 3) |
Is dat inderdaad het geval? Wordt hier de dispatcher geset, zodat je met bijvoorbeeld unit tests je gemockte MyClass2 terug krijgt?
Zit ik nog wel met het vraagstuk, blijft de Dispatcher voor de betreffende interface altijd gelden? Volgens mij zou ik in m'n TestMethod dan de Dispatcher moeten vullen met een mock object, maar pas in de te testen methode wordt het object gemaakt. Wellicht omdat er hier static methoden worden gebruikt dat hij dan 'onthoudt' dat je een MyClass2 terug wilt krijgen, maar dat weet ik niet 100% zeker.
Als deze class factory werkt zoals ik denk dat hij werkt, dan lijkt me dit een redelijk chique methode om alles te implementeren.
Battle.net - Jandev#2601 / XBOX: VriesDeJ