2016-05-20 13 views
1

私はLazyオブジェクトを作成するために、DryIocを使用できる必要があります。怠惰な<T>とDryIoc、私はそれを正しくやっていますか?

私はGodオブジェクトを使用し、complexe KeyPair<string, SomeAbstractType>の重い辞書に依存しているため、各値をLazy<SomeAbstractType>と置き換え、アプリケーションの読み込み速度を向上させたいと考えています。

私はこのようにPOCOをやったことがありますが、私はDryIocをマスターすることにはほど遠いので、私はそれを過ぎたかもしれません。

ここにコードを読んでください。

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 [答え]:

それは仕方simplier道のXDを達成することができます。

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(); 
     } 
    } 
} 

答えて

1

本来的には、の注射が好ましい。

あなたのために機能しますか?

+0

ありがとうございます。私が言ったように、私はそれをやりすぎたように感じた;) –

関連する問題