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); }
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); }
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); }
//批量注册 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)); }
public CatBuilder Register(Assembly assembly) { _cat.Register(assembly); return(this); }
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); }
// 自己提供工厂 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); }
public static Cat Register <TFrom, TTo>(this Cat cat, LifeTime lifeTime) where TTo : TFrom { return(cat.Register(typeof(TFrom), typeof(TTo), lifeTime)); }