servicestack,C#,Asp.net Core,servicestack" /> servicestack,C#,Asp.net Core,servicestack" />

C# Servicestack将IServiceCollection转换为Funq条目

C# Servicestack将IServiceCollection转换为Funq条目,c#,asp.net-core,servicestack,C#,Asp.net Core,servicestack,servicestack.core包是否包含实现 要将IServiceCollection转换为Funq容器注册?像这样的 var container = new Container(); services.Each(x => { if (x.ImplementationType != null) container.Register(x.ImplementationInstance,

servicestack.core包是否包含实现

要将IServiceCollection转换为Funq容器注册?像这样的

        var container = new Container();
        services.Each(x =>
        {
            if (x.ImplementationType != null)
                container.Register(x.ImplementationInstance, x.ServiceType);
            else if (x.ImplementationFactory != null)
                container.RegisterFn(x.ServiceType, x.ImplementationFactory);
            else
                container.RegisterAutoWiredType(x.ServiceType, x.ImplementationType, x.Lifetime == ServiceLifetime.Singleton ? ReuseScope.Container : x.Lifetime == ServiceLifetime.Scoped ? ReuseScope.Request : ReuseScope.None);

        });

        public static Container RegisterFn(this Container container, Type serviceType, Func<IServiceProvider, object> factory)
        {

            typeof(FunqExtensions).GetMethodInfos().First(x =>x.Name == "Register").MakeGenericMethod(serviceType).Invoke(null, new object[]{ container, factory});
            return container;
        }

        private static Container Register<T>(this Container container, Func<IServiceProvider, object> registrationFactory)
        {
            container.Register<T>(null, c => (T) registrationFactory(c));
            return container;
        }
var container=newcontainer();
服务。每个(x=>
{
if(x.ImplementationType!=null)
container.Register(x.ImplementationInstance,x.ServiceType);
else if(x.ImplementationFactory!=null)
RegisterFn(x.ServiceType,x.ImplementationFactory);
其他的
容器.RegisterAutoWiredType(x.ServiceType,x.ImplementationType,x.Lifetime==ServiceLifetime.Singleton?ReuseScope.container:x.Lifetime==ServiceLifetime.Scoped?ReuseScope.Request:ReuseScope.None);
});
公共静态容器寄存器Fn(此容器容器,类型serviceType,Func factory)
{
typeof(FunqExtensions).GetMethodInfos().First(x=>x.Name==“Register”).MakeGenericMethod(serviceType).Invoke(null,新对象[]{container,factory});
返回容器;
}
专用静态容器寄存器(此容器,Func registrationFactory)
{
container.Register(null,c=>(T)registationfactory(c));
返回容器;
}

没有Funq不是要取代.NET Core的IoC,而是任何一款。

为什么不呢?使用funq作为ioc容器并在其中插入核心注册,而不是在runtine拥有两个容器并试图在这两个容器中解析它们,这难道不是很有意义吗?@JoelHarkes使用.NET core的内置ioc for.NET core是为了支持它而设计的,ServiceStack的内置funq ioc for ServiceStack是有意义的。符合逻辑的是,在.NET Core Startup中注册的任何依赖项对.NET Core和ServiceStack都可用,而在ServiceStack中注册的任何依赖项现在只对ServiceStack可用。所以,当您希望在全球范围内注册时,请在.NETCore初创公司中注册。但这可能会导致巨大的混乱。假设我创建了一个包含扩展方法的库以包含在.netCore的IOC中,但我自己覆盖了其中一个类:我必须在netCores IOC容器中定义tis(否则找不到它),并且我不能使用我在funq容器中指定的依赖项,因为它只是单向的。假设在不同的框架中注册了依赖关系是不直观的,在不同的位置使用不同的IOC可能会混淆同一个IOC。不应该期望外部.NET核心IOC能够访问在内部框架IOC中注册的依赖项。如果您希望在任何地方都可以注册依赖项,只需使用.NET内核。在我们的代码中,它只是一个应用程序,而不是一个框架或其他。
其他框架
对于在dotnetcore上运行非常简单。当然,对我们来说,我们希望有一个地方来定义国际奥委会的注册,否则它会变得非常混乱。因此,简单地说,您建议在netcore的IServiceCollection中指定所有内容,以避免此问题。