2016-05-20 9 views
1

Ich muss in der Lage sein, DryIoc zu verwenden, um Lazy-Objekte zu erstellen.Lazy <T> mit DryIoc, mache ich es richtig?

Da ich mit einer Legacy-Anwendung arbeite, die ein God-Objekt verwendet und auf einem schweren Wörterbuch von complexe KeyPair<string, SomeAbstractType> beruht, möchte ich jeden Wert durch ein Lazy<SomeAbstractType> Gegenstück ersetzen und die Anwendung schneller laden lassen.

Ich habe ein POCO auf diese Weise gemacht, aber da ich DryIoc noch lange nicht beherrsche, hätte ich es vielleicht übertrieben.

Hier ist der Code, ich hoffe, Sie können lesen.

using System; 
using System.Diagnostics; 
using DryIoc; 

namespace ConsoleApplication2 
{ 
    public class Program 
    { 
     public class Postoned 
     { 
      private readonly IContainer _container; 

      public Postoned(IContainer container) 
      { 
       _container = container; 
      } 

      public Lazy<T> Create<T>() 
      { 
       return new Lazy<T>(() => 
       { 
        Debugger.Break(); 

        return _container.Resolve<T>(); 

       }); 
      } 
     } 

     public class Holder 
     { 
      public Lazy<int> Li { get; set; } 
      public Lazy<string> Ls { get; set; } 

      public Holder(Lazy<int> li, Lazy<string> ls) 
      { 
       Li = li; 
       Ls = ls; 
      } 
     } 

     static void Main(string[] args) 
     { 
      var c = new Container(); 

      c.RegisterInstance(c); 
      c.RegisterMapping<IContainer, Container>(); 

      c.RegisterInstance(66, Reuse.Singleton); 
      c.RegisterInstance("string 66", Reuse.Singleton); 
      c.Register(Made.Of(() => new Postoned(Arg.Of<IContainer>())), Reuse.Singleton); 

      c.Register(Made.Of(r => ServiceInfo.Of<Postoned>(), (Postoned postoned) => postoned.Create<int>()), Reuse.Singleton); 
      c.Register(Made.Of(r => ServiceInfo.Of<Postoned>(), (Postoned postoned) => postoned.Create<string>()), Reuse.Singleton); 

      c.Register(Made.Of(() => new Holder(Arg.Of<Lazy<int>>(), Arg.Of<Lazy<string>>())), Reuse.Singleton); 

      var holder = c.Resolve<Holder>(); 
      Debugger.Break(); 
      var li = holder.Li; 
      Debugger.Break(); 
      var i = li.Value; 

      Console.WriteLine(i); 

      Console.WriteLine(holder.Ls.Value); 

      Console.ReadLine(); 
     } 
    } 
} 

EDIT [Antwort]:

Es kann eine Art und Weise simplier Weise XD erreicht werden.

using System; 
using System.Diagnostics; 
using DryIoc; 

namespace ConsoleApplication2 
{ 
    public class Program 
    { 
     public class Holder 
     { 
      public Lazy<int> Li { get; set; } 
      public Lazy<string> Ls { get; set; } 

      public Holder(Lazy<int> li, Lazy<string> ls) 
      { 
       Li = li; 
       Ls = ls; 
      } 
     } 

     static void Main(string[] args) 
     { 
      var c = new Container(); 

      c.RegisterInstance(c); 
      c.RegisterMapping<IContainer, Container>(); 

      c.RegisterInstance(66, Reuse.Singleton); 
      c.RegisterInstance("string 66", Reuse.Singleton); 

      c.Register(Made.Of(() => new Holder(Arg.Of<Lazy<int>>(), Arg.Of<Lazy<string>>())), Reuse.Singleton); 

      var holder = c.Resolve<Holder>(); 
      Debugger.Break(); 
      var li = holder.Li; 
      Debugger.Break(); 
      var i = li.Value; 

      Console.WriteLine(i); 

      Console.WriteLine(holder.Ls.Value); 

      Console.ReadLine(); 
     } 
    } 
} 

Antwort

1

DryIoc sypports native Injektion von Lazy wrapper of service.

Funktioniert es für Sie?

+0

Es tut, danke. Wie gesagt, ich fühlte mich, als würde ich es übertreiben;) –

Verwandte Themen