美文网首页
6 ASP .NET Core-依赖注入

6 ASP .NET Core-依赖注入

作者: 无为无味无心 | 来源:发表于2018-10-24 11:08 被阅读0次

    1 关于 DIP, IOC,DI

    DIP 依赖倒置原则:软件设计原则,高层和底层要依赖于抽象,不依赖具体实现。
    IOC 控制反转 : DIP实现原则的模式。
    DI 依赖注入 :IOC的具体实现。

    2 依赖注入生命周期

    Singleton 单例服务,从当前服务容器中获取这个类型的实例永远都是同一个实例。
    Scoped 域内单例,为每个作用域创建一个服务实例。
    Transient 瞬态,从服务容器每次获取都创建一个新的实例。

    3 用例服务

    image.png
    public interface IUserRepository
    {
        dynamic GetUser(int id);
    }
    public class UserRepository : IUserRepository
    {
        public dynamic GetUser(int id)
        {
            dynamic u=new ExpandoObject();
            u.Name = "Jack";
            u.Id = id;
            return u;
        }
    }
    public interface IUserService
    {
        string GetUserName(int id);
    }
    
    public class UserService : IUserService
    {
        private readonly IUserRepository _userRepository;
    
        public UserService(IUserRepository userRepository)
        {
            _userRepository = userRepository;
        }
    
        public string GetUserName(int id)
        {
            var u = _userRepository.GetUser(id);
            return u.Name;
        }
    }
    

    4 注册服务的方法

    //使用扩展方法
    services.AddSingleton<IUserService, UserService>();
    services.AddSingleton(typeof(IUserService), typeof(UserSevice));
    //使用 服务描述
    services.Add(ServiceDescriptor.Singleton(typeof(IUserService), typeof(UserSevice)));
    services.Add(ServiceDescriptor.Singleton<IUserService,UserService>());
    services.Add(ServiceDescriptor.Describe(typeof(IUserService), typeof(UserSevice),ServiceLifetime.Singleton));
    //自定义
    services.AddSingleton<IUserService>(new UserService(new UserRepository()));
    services.AddSingleton<IUserService>(provider =>
        new UserService(provider.GetRequiredService<IUserRepository>()));
    

    5 服务使用

    “GetService<T>”与“GetRequiredService<T>”这两个方法。
    这两个方法非常接近,唯一不同的是GetRequiredService会在找不到服务的时候抛出异常,而GetService在找不到服务时会返回null。

    //
    // 摘要:
    //     Defines a mechanism for retrieving a service object; that is, an object that
    //     provides custom support to other objects.
    public interface IServiceProvider
    {
        //
        // 摘要:
        //     Gets the service object of the specified type.
        //
        // 参数:
        //   serviceType:
        //     An object that specifies the type of service object to get.
        //
        // 返回结果:
        //     A service object of type serviceType. -or- null if there is no service object
        //     of type serviceType.
        object GetService(Type serviceType);
    
    }
    public static class ServiceProviderServiceExtensions
        {
          
            public static IServiceScope CreateScope(this IServiceProvider provider);
            
            public static object GetRequiredService(this IServiceProvider provider, Type serviceType);
           
            public static T GetRequiredService<T>(this IServiceProvider provider);
          
            public static T GetService<T>(this IServiceProvider provider);
      
            public static IEnumerable<T> GetServices<T>(this IServiceProvider provider);
          
            public static IEnumerable<object> GetServices(this IServiceProvider provider, Type serviceType);
    }
    

    相关文章

      网友评论

          本文标题:6 ASP .NET Core-依赖注入

          本文链接:https://www.haomeiwen.com/subject/acuttqtx.html