Ninject中的IRegistrationSource(来自AutoFac)等效项是什么?

时间:2018-08-07 07:45:01

标签: ninject autofac

我想对NinJect使用类似的东西。 如果我在构造函数中有一个类似CustomerSettings,CurrencySettings等的类,则它将由AutoFac解决。 如果这些类(CustomerSettings,CurrencySettings)实现了接口ISettings,它将从ISettingService调用方法LoadSetting。 然后将ISettingService接口解析为SettingService。

我在AutoFac中有以下代码。

using Autofac;
using Autofac.Builder;
using Autofac.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var containerBuilder = new ContainerBuilder();


            containerBuilder.RegisterType<SettingService>().As<ISettingService>();

            //register all settings
            containerBuilder.RegisterSource(new SettingsSource());


            Console.WriteLine("Hello World!");
            Console.ReadKey();
        }
    }

    public class SettingsSource : IRegistrationSource
    {
        static readonly MethodInfo BuildMethod = typeof(SettingsSource).GetMethod(
            "BuildRegistration",
            BindingFlags.Static | BindingFlags.NonPublic);

        public IEnumerable<IComponentRegistration> RegistrationsFor(
                Service service,
                Func<Service, IEnumerable<IComponentRegistration>> registrations)
        {
            var ts = service as TypedService;
            if (ts != null && typeof(ISettings).IsAssignableFrom(ts.ServiceType))
            {
                var buildMethod = BuildMethod.MakeGenericMethod(ts.ServiceType);
                yield return (IComponentRegistration)buildMethod.Invoke(null, null);
            }
        }

        static IComponentRegistration BuildRegistration<TSettings>() where TSettings : ISettings, new()
        {
            return RegistrationBuilder
                .ForDelegate((c, p) =>
                {
                    return c.Resolve<ISettingService>().LoadSetting<TSettings>();
                })
                .InstancePerLifetimeScope()
                .CreateRegistration();
        }

        public bool IsAdapterForIndividualComponents { get { return false; } }
    }


}

0 个答案:

没有答案
相关问题