StructureMapã«é¢ãã
æåã®æçš¿ã®ç¶ã
æåã®éšåã§ã¯ããããã¯ã«ã€ããŠèª¬æããŸããã
- èšçœ®
- ç»é²ïŒåºæ¬ããããã¡ã€ã«ããã©ã°ã€ã³ãã¹ãã£ã³ãå±éïŒ
ãã®ããŒãã§ã¯ã以äžã«ã€ããŠèª¬æããŸãã
- ã³ã³ã¹ãã©ã¯ã¿ãŒïŒåçŽåãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãè€ååã匷å¶ãåŒæ°ã®èšå®ïŒ
- ããããã£ïŒåçŽãªããããã£èšå®ããã«ãã€ã³ããããã£èšå®ããã¬ãŒã ã¯ãŒã¯ã䜿çšããããããã£ã®èšå®ãæ¢åã®ã¯ã©ã¹ã®æ¡åŒµïŒ
- ã©ã€ãã¿ã€ã
ã³ã³ã¹ãã©ã¯ã¿ãŒ
IoCã³ã³ãããŒã®äŸåé¢ä¿ã®è§£æ±ºã«é¢é£ããå®éã®ããã°ã©ãã³ã°ã§ã®éåžžã«éèŠãªè³ªåãããã€ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãæã€ã¯ã©ã¹ã«ã€ããŠã¯ã©ãã§ããã ããããåæåããæ¹æ³ããã©ã¡ãŒã¿ãèšå®ããæ¹æ³ã倿Žããæ¹æ³ãªã©ã 以äžã®è³ªåã®ã»ãšãã©ãåçãããããšãæã¿ãŸãã StructureMapã¯æ¬åœã«åŒ·åã§æè»ã§ãã
ãã¬ãŒã ã¯ãŒã¯ã®æ©èœã説æããåã«ããã¹ãã¯ã©ã¹ã«ã€ããŠèª¬æããå¿
èŠããããŸãã ä»åã¯ããå°é£ã«ãªããŸãã ç¶æ¿ãåçŽåãšè€ååã®ã³ã³ã¹ãã©ã¯ã¿ã
ããã§ã次ã®ã¯ã©ã¹ãçšæããŸãããã
public interface IClassA : IClass { int A { get; set; } } public interface IClassB : IClass {} public class ClassA : IClassA { public int A { get; set; } public int B { get; set; } public Class1 Class1 { get; set; } [DefaultConstructor] public ClassA() {} public ClassA(int a) { A = a; } } public class ClassB : IClassB { public IClassA ClassA; public ClassB(IClassA classA) { ClassA = classA; } } public class ClassM : IClassA { public int A { get; set; } public ClassM(int a) { A = a; } public ClassM(int a, int b) { A = a + b; } }
ãããã¯çŸæç¹ã§ããã€ãã®åé·æ§ãåããŠãããã¹ããŒãªãŒã§ããå°ã圹ç«ã¡ãŸãã
ããã§ã¯ãæãåçŽãªãªãã·ã§ã³ããå§ããŸãããã
åçŽå
ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒã®1ã€ãæŽæ°ãã©ã¡ãŒã¿ãŒãåãå
¥ããClassAã¯ã©ã¹ããå§ããŸãããã
public class WithSimpeArguments { public IContainer Container; public WithSimpeArguments() { Container = new Container(x => x.For<IClassA>().Use<ClassA>() .Ctor<int>().Is(5) ); } }
äŸãããããããã«ãå€ã䜿çšããŠã³ã³ã¹ãã©ã¯ã¿ãŒãåæåããæç€ºãããã§ã«ããç¥ãããŠãã宣èšã«è¿œå ãããŸãã ãã®å Žåãintåã®ãã©ã¡ãŒã¿ãŒã¯1ã€ãããªããããã³ã³ã¹ãã©ã¯ã¿ãŒå®£èšã¯åçŽåãããã¹ããŒã ã«åŸããŸãã åæåããã»ã¹ã§ãããã«å€ã瀺ããŸããã åæã«ãStructureMapã¯å€ãæŽæ°ã§ãªããã°ãªããªãããšãéç¥ããŸãã
æäœã確èªããã«ã¯ããã§ã«ããªãã¿ã®ã³ãŒããåŒã³åºãããšãã§ããŸã
private static string WithSimpleArgumentsExample() { var container = new WithSimpeArguments().Container; var classA = (ClassA) container.GetInstance<IClassA>(); return classA.A.ToString(); }
ãã®çµæãæ°åã®5ãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã«åãåã®2ã€ã®ãã©ã¡ãŒã¿ãŒãããå Žåã®äŸã¯è€éã§ãã å®éšã¯ã©ã¹ClassMãšããŠã
public class WithMultipleSimpeArguments { public IContainer Container; public WithMultipleSimpeArguments() { Container = new Container(x => x.For<IClassA>().Use<ClassM>() .Ctor<int>("a").Is(6) .Ctor<int>("b").Is(5)); } }
ããã§ã
.Ctor <int>ïŒ "a"ïŒãIsïŒ6ïŒã«åŒæ°ã®åå
ã远å ãããŠããããããã¬ãŒã ã¯ãŒã¯ã¯åŒæ°ã®å€ãæ£ç¢ºã«äžèŽãããããšãã§ããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯åžžã«æãã貪欲ãªãã³ã³ã¹ãã©ã¯ã¿ãèŠã€ãããã¹ãŠã®åŒæ°ãåæåããããšãæã¿ãŸãã ã¯ã©ã¹ã®çŸåšã®å®è£
ã§ã¯ã2çªç®ã®åŒæ°ã®å€ã®èšå®ãçç¥ããããšã¯ã§ããŸããã ãã ããããã©ã«ãã§äœ¿çšããã³ã³ã¹ãã©ã¯ã¿ãŒãStructureMapã«æç€ºã§ããŸãããã®
ããã«ã¯ã
DefaultConstructor屿§ã䜿çšããå¿
èŠããããŸãã
ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒ
DefaultConstructor屿§ã䜿çšãããšãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹åã«äœ¿çšããã³ã³ã¹ãã©ã¯ã¿ãŒãæç€ºçã«æå®ã§ããŸãã ãã®ãããåã®äŸã§ã¯å€æ°bã®å®£èšãçç¥ã§ããããã»ã¹ã«äœãèœã¡ãŸããã§ããã
public class ClassM : IClassA { public int A { get; set; } [DefaultConstructor] public ClassM(int a) { A = a; } public ClassM(int a, int b) { A = a + b; } }
ããã§ã1ã€ã®ãã©ã¡ãŒã¿ãŒã§ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšã§ããŸã
è€åã¿ã€ã
æ§é åèªäœã¯ãè€ååã«ãããã¹ãŠã®äŸåé¢ä¿ãæ€åºããã³è§£æ±ºãããããè€ååã®æäœã¯éåžžã«ç°¡åã§ãã ã€ãŸã æåã«ã¯ã©ã¹ãèŠããšãClassBã¯ã©ã¹ãClassAã¯ã©ã¹ã«ãã£ãŠåæåãããŠããããšãããããŸãã ãã®çš®é¡ã®äŸåé¢ä¿ã解決ããããã«ç¹å¥ãªãã®ã¯å¿
èŠãªãããšãããããŸããã
public class WithObjectArguments { public IContainer Container; public WithObjectArguments() { Container = new Container(x => { x.For<IClassA>().Use<ClassA>().Ctor<int>().Is(5); x.For<IClassB>().Use<ClassB>(); }); } }
äŸãããããããã«ã远å ã®æŒç®åã¯é©çšãããŸããã ãã ããClassAã«ãã£ãŠåæåãããClassBã¯ã©ã¹ãèŠæ±ã§ããŸãã
private static string WithObjectArgumentsExample() { var container = new WithObjectArguments().Container; var classA = (ClassB) container.GetInstance<IClassB>(); return classA.ClassA.A.ToString(); }
æ°åã®5ãç»é¢ã«è¡šç€ºãããŸãã
ã¿ã€ããã£ã¹ã
ClassBã¯ã©ã¹ã®å®£èšãèŠããšãã³ã³ã¹ãã©ã¯ã¿ãŒã®å€æ°ãç¹å®ã®åã§ã¯ãªãã€ã³ã¿ãŒãã§ã€ã¹ã§ããããšãããããŸãã ã€ã³ã¿ãŒãã§ãŒã¹ã®ä»£ããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãClassAã¯ã©ã¹ãåãå
¥ããããã«ã¯ã©ã¹ãæžãçŽããŸã
public class ClassB : IClassB { public ClassB(ClassA classA) { ClassA = classA; } }
ã³ã³ãããåäžã®ããŒã¿åãç»é²ããŠè¿ããããåãã€ã³ãã£ã³ã°ã¯çºçããŸããã ç§ãã¡ã®å Žåãããã¯IClassAã§ãã
private static string WithObjectArgumentsForwardingAndWiringExample() { var container = new WithObjectArgumentsForwarding().Container; var classB = (ClassB) container.GetInstance<IClassB>(); return classB.ClassA.A.ToString(); }
ClassAã¯ã©ã¹ã®ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããããããã€ã³ãã£ã³ã°ã¯çºçããªãã£ãããããã®ã³ãŒãã¯0ãè¿ããŸãã
ããªãã¯ãããåé¡ã§ã¯ãªããšæšæž¬ããŸããã StructureMapãäœã«ã€ãªããããæå®ã§ããŸãã ããã¯ããœãŒã¹ã¿ã€ããæå®ããå¿
èŠã®ãã
Forwardã³ãã³ãã䜿çšããŠè¡ãããŸãã
public class WithObjectArgumentsForwarding { public IContainer Container; public WithObjectArgumentsForwarding() { Container = new Container(x => { x.For<IClassA>().Use<ClassA>().Ctor<int>().Is(5); x.Forward<IClassA, ClassA>(); x.For<IClassB>().Use<ClassB>(); }); } }
ããã§ãWithObjectArgumentsForwardingAndWiringExampleã¡ãœãããåŒã³åºããŠãå¿çã§5ãååŸã§ããŸãã
åŒæ°ã®å®çŸ©
ã»ãšãã©ã®å Žåãäºåã«ã¯ã©ã¹ã®åŒæ°ãèŠã€ããŠèšå®ããããšã¯äžå¯èœã§ãããå¿
èŠãªã¯ã©ã¹ãäœæããæç¹ã§ã®ã¿åŒæ°ãèªèãããŸãã ãããŠããããã¯ããã°ã©ã ãæžãäœæ¥æ¥ã§ãããããã¯ã©ã¹ã®äœææã«åŒæ°ãèšå®ãããµããŒãã¯ãStructureMapã«è¡šç€ºãããŸãããå©ãã«ã¯ãªããŸããã
æ°ããåŒæ°å€ã䜿çšããŠã¯ã©ã¹ãåŒã³åºãããã»ã¹ã¯ãYodaãã¹ã¿ãŒã®èšèªã§ã®éä¿¡ã«äŒŒãŠããŸãããããã¯DSLã®ç¹ç°æ§ã§ãã æè¡çãªå¶éã§ãã
ãããã£ãŠãæ°ããClassAã¯ã©ã¹ã§ClassBã¯ã©ã¹ãåŒã³åºããŠã¿ãŸãããã ãããè¡ãã«ã¯ãWithã¹ããŒãã¡ã³ããå¿
èŠã§ãã
private static string WithObjectArgumentsOverridingExample() { var container = new WithObjectArgumentsForwarding().Container; var classB = (ClassB) container .With(new ClassA(8)) .GetInstance<IClassB>(); return classB.ClassA.A.ToString(); }
ãã®å Žåããã¬ãŒã ã¯ãŒã¯ã¯ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãã©ã®åŒæ°ã«ãããããããæç¢ºã«æ±ºå®ã§ãããããåŒæ°ã®ååãæå®ããå¿
èŠã¯ãããŸããã
ã¯ã©ã¹ã«å¯ŸããŠããå€ãã®åŒæ°ãæå®ããå¿
èŠãããå Žåã¯ããã©ã¡ãŒã¿ãŒåãšãã®å€ã§ããå€ãã®Withã¡ãœããã䜿çšããå¿
èŠããããŸãã
private static string WithObjectArgumentsOverridingExample() { var container = new WithObjectArgumentsForwarding().Container; var classB = (ClassB) container .With(new ClassA(8)) .With("s").EqualTo(5) .GetInstance<IClassB>(); return classB.ClassA.A.ToString(); }
ããã§ããã¶ã€ããŒãšã®äœæ¥ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ããã»ãŒãã¹ãŠã®ã¢ãŒããã¯ãã£ã¢ãããŒãã解決ããã®ã«ååã«ã«ããŒããããšæããŸãã
ããããã£
å¿
èŠãªã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒã«å ããŠãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãã«ã¯ã©ã¹ããããã£ã®å€ãèšå®ãããšéåžžã«äŸ¿å©ã§ãã ã€ãŸã æžã代ããã«
var classA = new ClassA(); classA.A = 8; classA.B = 20;
次ã®ããã«ãããããã£ãããçãããããããã«èšå®ã§ããŸãã
var classA = new ClassA { A = 8, B = 20 };
StuctureMapã®å Žåãããã¯éåžžã«å¯èœã§ãããåããšã¬ã¬ã³ãã§çè§£ããããæ¹æ³ã§ãã
ã·ã³ãã«ãªããããã£èšå®
äžã®å³ã®ããã«ãæãåçŽãªã±ãŒã¹ã§ã¯ã
SetPropertyã¡ãœããã䜿çšããŠãã©ã¡ãŒã¿ãŒãèšå®ã§ã
ãŸã ã
public class WithArgumentsSetProperty { public IContainer Container; public WithArgumentsSetProperty() { Container = new Container(x => x.For<IClassA>().Use<ClassA>() .Ctor<int>().Is(5) .SetProperty(p => { pA = 8; pB = 20; })); } }
äŸãããããããã«ãããããã£ã¯åŒ·ãåä»ããããŠãããintelliSenseãã³ãã䜿çšã§ããŸãã ããããã£ã®èšå®ã¯ç°¡åã§ç°¡åã§ãã ãã¹ãŠã®ããããã£ãèšå®ã§ããããã§ã¯ãªããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãæ§ç¯ããæ®µéã§åæåããããããã£ã®ã¿ãèšå®ã§ããããšã¯æããã§ãã
çµã¿èŸŒã¿ããããã£å®çŸ©
ã€ã³ã©ã€ã³ãã©ã¡ãŒã¿èšå®ã䜿çšããã«ã¯ã
Setterã¡ãœããã䜿çšãããŸãã ãã®æ¹æ³ã䜿çšãããšãäžåºŠã«1ã€ã®ãã©ã¡ãŒã¿ãŒã®å€ãèšå®ã§ããŸãã ã¡ãœããã®åŒæ°ã¯é¢æ°ã§ããããã
æãç°¡åãªããšã¯ãåæåã®ãã©ã¡ãŒã¿ãŒãæç€ºçã«èšå®ããããšã§ãã
public class WithArgumentsSetterExplicit { public IContainer Container; public WithArgumentsSetterExplicit() { Container = new Container(x => { x.For<IClass1>().Use<Class1>(); x.For<IClassA>().Use<ClassA>() .Ctor<int>().Is(5) .Setter(c => c.Class1).Is(new Class1()); }); } }
ãã®äŸã¯ãããããã£Class1ãåžžã«æ°ããã¯ã©ã¹Class1ã«ãã£ãŠåæåãããããšã瀺ããŠããŸãã ãã®ãããªã¬ã³ãŒãã¯ãã¯ã©ã¹ã«åãã¿ã€ãã®ããããã£ãè€æ°ããå Žåã«é©çšããå¿
èŠããããŸãã ç¹å®ã®ã¿ã€ãã®ããããã£ã1ã€ãããªãå Žåããã¬ãŒã ã¯ãŒã¯ã¯ãæž¡ããããã©ã¡ãŒã¿ãŒã®å€ãå²ãåœãŠãããããã£ãåå¥ã«æ±ºå®ã§ããŸãã
ãããã£ãŠãæé»çãªããããã£ã®åæåã
public class WithArgumentsSetterImplicit { public IContainer Container; public WithArgumentsSetterImplicit() { Container = new Container(x => { x.For<IClass1>().Use<Class1>(); x.For<IClassA>().Use<ClassA>() .Ctor<int>().Is(5) .Setter<Class1>().Is(new Class1()); }); } }
ãã®äŸã§ã¯ãããããã£ã®ååãæå®ããŸããã§ããããClass1åã®ããããã£ã¯1ã€ãããªãããããã¹ãŠããŸããããŸããã
ãã¬ãŒã ã¯ãŒã¯ã§ããããã£ãèšå®ãã
StructureMapã¯èªåçã«ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ã«çœ®ãæããããšãã§ãããããã¯ã©ã¹ããããã£ãèªåçã«èšå®ã§ããŸããïŒ
ãã¡ããã§ããŸãïŒ
ãããããã¡ãã圌ã¯ãããèªç±ã«è¡ãã®ã§ã¯ãªãããã¹ãŠã®ãã£ãŒã«ãã«å¯ŸããŠã§ã¯ãªãããªãŒãã³ã³ããªãŒããšããŠç€ºããããã£ãŒã«ãã«å¯ŸããŠã®ã¿è¡ããŸãã
åã®äŸã倿ŽããŠãããããã£ã®äŸåé¢ä¿ãæ§é ãããã«ãã£ãŠè§£æ±ºããã³å¶åŸ¡ãããããã«ããããšãã§ããŸãã
public class WithArgumentsSetterImplicitDefault { public IContainer Container; public WithArgumentsSetterImplicitDefault() { Container = new Container(x => { x.For<IClass1>().Use<Class1>(); x.For<IClassA>().Use<ClassA>() .Ctor<int>().Is(5) .Setter<Class1>().IsTheDefault(); }); } }
ãã®äŸã§ã¯ãæ°ãã
IsTheDefaultã¡ãœãã
ãç»å ŽããŸãã ãããã¯ãç¬èªã®ææ®µã§äŸåé¢ä¿ã解決ãããããã¬ãŒã ã¯ãŒã¯ã«æç€ºããŸãã ã€ãŸã ãã®å Žåãã¯ã©ã¹ClassAã®ã¿ã€ãClass1ã®ããããã£ãäœæãããClass1ã®ç»é²æ¹æ³ã«åºã¥ããŠå²ãåœãŠãããŸãã
ç¹å®ã®ã¿ã€ãã®ãã¹ãŠã®ããããã£ãããã©ã«ãå€ã§åæåããå¿
èŠããããšèšããå Žåãããããã©ã¡ãŒã¿ã®åæåããããŸãã ãããè¡ãã«ã¯ã
SetAllPropertiesã³ãã³ãã䜿çšããŸãã
public class WithArgumentsSetterBatchImplicitDefault { public IContainer Container; public WithArgumentsSetterBatchImplicitDefault() { Container = new Container(x => { x.For<IClass1>().Use<Class1>(); x.For<IClassA>().Use<ClassA>() .Ctor<int>().Is(5); x.SetAllProperties(c => c.OfType<Class1>()); }); } }
ãã®ãã³ãã䜿çšããŠãStructureMapã¯ãããããã£ã¿ã€ããClass1ã§ããåŒã³åºãå
ã¯ã©ã¹ã®ãã¹ãŠã®ããããã£ãèªåçã«åæåããŸãã
æ¢åã®ã¯ã©ã¹ã®ã¢ããã°ã¬ãŒã
æãšããŠãäœæã«åœ±é¿ãäžããããšãã§ããªãæ¢æã®ã¯ã©ã¹ããååŸã§ããªãããšããããŸãã åæã«ãèªåã¢ãŒãã§ã¯ã©ã¹ãã£ãŒã«ãã®ããŒãã®å
å¡«ãèªååãããã§ãã ãããŠãããã¯StructureMapã§å¯èœã§ãã
ç§ãã¡ã®ã·ã¹ãã ã«äœæãããŠããªãClassAãç§ãã¡ã®ãšããã«ãã£ãŠã¿ãŸãããã Class1åã®ããããã£ãåæåããå¿
èŠããããŸãã æåã«StructureMapãã»ããã¢ããããŸãã
public class WithArgumentsBuildUp { public IContainer Container; public WithArgumentsBuildUp() { Container = new Container(x => { x.For<IClass1>().Use<Class1>(); x.Forward<IClass1, Class1>(); x.SetAllProperties(c => c.OfType<Class1>()); }); } }
ããã§ãå©çšå¯èœãªæ§æã«åŸã£ãŠãªããžã§ã¯ãã宿ããã
BuildUpã¡ãœãããåŒã³åºãããšãã§ããŸãã
var container = new WithArgumentsBuildUp().Container; var classA = new ClassA(14); container.BuildUp(classA);
2è¡ç®ã®ããããã£Class1 = nullã§ã¯ãBuildUpãåŒã³åºããåŸããªããžã§ã¯ãã¯å®å
šã«æºåãã§ããŠããŸãã
ã©ã€ãã¿ã€ã
éèŠãªèŠå ã¯ããªããžã§ã¯ãã®å¯¿åœãå¶åŸ¡ããèœåã§ãã ããã€ãã®ã¯ã©ã¹ã§ã¯ãåãã€ã³ã¹ã¿ã³ã¹ãååŸããå¿
èŠããããä»ã®ã¯ã©ã¹ã§ã¯ãæ°ããã€ã³ã¹ã¿ã³ã¹ãååŸããå¿
èŠããããŸãã ããã¯ãã³ã³ããå
ã®ã«ãŒã«ã®äœæäžã«å¶åŸ¡ããããšãã§ããŸãã
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ã7ã€ã®ãªããžã§ã¯ãã©ã€ãã¿ã€ã 管çããªã·ãŒã§åäœããŸãã
- ãªã¯ãšã¹ãããšïŒããã©ã«ãïŒ-æ¯åæ°ãããªããžã§ã¯ããäœæãããŸãã
- HttpContextLifecycle
- ã·ã³ã°ã«ãã³ã©ã€ããµã€ã¯ã«
- ThreadlocalStorageLifecycle
- UniquePerRequestLifecycle-èŠæ±ããããªããžã§ã¯ããåæåãããªããžã§ã¯ãã®ãã§ãŒã³å
šäœãäžæã§ããããšãä¿èšŒããŸãã
- HttpSessionLifecycle
- HybridLifecycleã¯HttpSessionLifecycleãŸãã¯ThreadlocalStorageLifecycleã§ã
- HybridSessionLifecycle-ãŸãã¯HttpContextLifecycleããŸãã¯HttpSessionLifecycle
äŸãšããŠåçŽãªã¯ã©ã¹ã䜿çšããŠããããã®ããã€ããèããŠã¿ãŸãããã
public class ClassX : IClassX { public int Counter { get; private set; } public void Increase() { Counter++; } } public interface IClassX {}
Singletonãæåã®è¡ãšããŸãã
public class LifecycleSingleton { public IContainer Container; public LifecycleSingleton() { Container = new Container(x => x.For<IClassX>().LifecycleIs(new SingletonLifecycle()).Use<ClassX>()); Container = new Container(x => x.For<IClassX>().Singleton().Use<ClassX>()); } }
ç°¡æçãªæ¹æ³ã¯ãåºæ¬çãªç掻æ¿çã®ããã«å®çŸ©ãããŠããŸãã ã€ãŸã
SingletonïŒïŒãš
LifecycleIsïŒæ°ããSingletonLifecycleïŒïŒïŒã®äž¡æ¹ã䜿çšã§ããŸãã
ãã§ãã¯ãšããŠãèŠèŠçãªäŸã䜿çšã§ããŸãã
private static string LifecycleSingleton() { var singleton = new LifecycleSingleton().Container; var classX = (ClassX) singleton.GetInstance<IClassX>(); classX.Increase(); Console.WriteLine(classX.Counter); classX = (ClassX) singleton.GetInstance<IClassX>(); classX.Increase(); Console.WriteLine(classX.Counter); return "done"; }
ãã®çµæãããŒã¿ãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãïŒã1ã2ãå®äºãã ç°¡åãªçºè¡šã§ãã1ã1ãDoneããšè¡šç€ºãããŸãã
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåäžã®ã¹ã¬ããå
ã«ä¿åããã«ã¯ã
ThreadLocalStorageLifecycle ããŸãã¯çã圢åŒã®
HybridHttpOrThreadLocalScopedã䜿çšããŸã
public class LifecycleThreadLocal { public IContainer Container; public LifecycleThreadLocal() { Container = new Container(x => x.For<IClassX>() .LifecycleIs(new ThreadLocalStorageLifecycle()) .Use<ClassX>()); Container = new Container(x => x.For<IClassX>() .HybridHttpOrThreadLocalScoped() .Use<ClassX>()); } }
HttpContextLifecycleã«å®çŸ©ãããŠãã
HttpContextScopedã®ç¥èª
public class LifecycleHttpContext { public IContainer Container; public LifecycleHttpContext() { Container = new Container(x => x.For<IClassX>() .LifecycleIs(new HttpContextLifecycle()) .Use<ClassX>()); Container = new Container(x => x.For<IClassX>() .HttpContextScoped() .Use<ClassX>()); } }
次ã®éšåã«ç¶ããŸãã