和DryIoc一起懒惰,我做得对吗?

时间:2016-05-20 13:44:41

标签: code-readability dryioc

我需要能够使用DryIoc来创建Lazy对象。

因为我正在使用遗留应用程序使用God对象并依赖于繁重的复杂词典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();
        }
    }
}
编辑[回答]:

可以通过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 :(得分:1)

DryIoc原生地支持注射Lazy wrapper of service

它对你有用吗?