Пример #1
0
        public static Cat Register <TService>(this Cat cat, TService instance)
        {
            Func <Cat, Type[], object> factory = (container, args) => instance;

            cat.Register(new ServiceRegistry(typeof(TService), LifeTime.Root, factory));
            return(cat);
        }
Пример #2
0
 public CatBuilder(Cat cat)
 {
     _cat = cat;
     //create builder的时候,主要是要告诉外面的使用者,我们的容器的Scope是如何定义的。这里就需要注意,注入Scope的肯定是当前root容器的子容器,不然Scope销毁的时候会销毁掉root
     //Transient的原因是,Scope是服务于每一个服务调用的,Scope必须而且只能是Transient。
     _cat.Register <IServiceScopeFactory>(c => new ServiceScopeFactory(c.CreateChild()), LifeTime.Transient);
 }
Пример #3
0
        public static Cat Register(this Cat cat, Type from, Type to, LifeTime lifeTime)
        {
            // args为范型的封锁类型,非范型上层判定之后会传递new Type[0]
            Func <Cat, Type[], object> factory = (container, args) => Create(container, to, args);

            // ServiceRegistry将类型,生命周期,与工厂绑定
            cat.Register(new ServiceRegistry(from, lifeTime, factory));
            return(cat);
        }
Пример #4
0
        //批量注册
        public static Cat Register(this Cat cat, Assembly assembly)
        {
            var typedAttributes = from type in assembly.GetExportedTypes()
                                  let attribute = type.GetCustomAttribute <MapToAttribute>()
                                                  where attribute != null
                                                  select new { ServiceType = type, Attribute = attribute };//第一个是assembly里真实的类型,第二个是那个类型的Attribute的声明

            foreach (var item in typedAttributes)
            {
                cat.Register(item.Attribute.ServiceType, item.ServiceType, item.Attribute.LifeTime);
            }
            return(cat);
        }
        public CatBuilder CreateBuilder(IServiceCollection services)
        {
            var cat = new Cat();

            foreach (var service in services)
            {
                //针对三个构造途径分别注册。
                if (service.ImplementationFactory != null)
                {
                    cat.Register(service.ServiceType, provider => service.ImplementationFactory(provider), service.Lifetime.AsCatLifetime());
                }
                else if (service.ImplementationInstance != null)
                {
                    // 这个只能是root里的单例
                    cat.Register(service.ServiceType, service.ImplementationInstance);
                }
                else if (service.ImplementationType != null)
                {
                    cat.Register(service.ServiceType, service.ImplementationType, service.Lifetime.AsCatLifetime());
                }
            }
            return(new CatBuilder(cat));
        }
Пример #6
0
 public CatBuilder Register(Assembly assembly)
 {
     _cat.Register(assembly);
     return(this);
 }
Пример #7
0
 public static Cat Register <TService>(this Cat cat, Func <Cat, object> factory, LifeTime lifeTime)
 {
     cat.Register(new ServiceRegistry(typeof(TService), lifeTime, (container, args) => factory(container)));
     return(cat);
 }
Пример #8
0
 // 自己提供工厂
 public static Cat Register(this Cat cat, Type serviceType, Func <Cat, object> factory, LifeTime lifeTime)
 {
     cat.Register(new ServiceRegistry(serviceType, lifeTime, (container, args) => factory(container)));
     return(cat);
 }
Пример #9
0
 public static Cat Register <TFrom, TTo>(this Cat cat, LifeTime lifeTime) where TTo : TFrom
 {
     return(cat.Register(typeof(TFrom), typeof(TTo), lifeTime));
 }