6 ASP .NET Core-依赖注入

2018-10-24  本文已影响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);
}
上一篇下一篇

猜你喜欢

热点阅读