6 ASP .NET Core-依赖注入
2018-10-24 本文已影响0人
无为无味无心
1 关于 DIP, IOC,DI
DIP 依赖倒置原则:软件设计原则,高层和底层要依赖于抽象,不依赖具体实现。
IOC 控制反转 : DIP实现原则的模式。
DI 依赖注入 :IOC的具体实现。
2 依赖注入生命周期
Singleton 单例服务,从当前服务容器中获取这个类型的实例永远都是同一个实例。
Scoped 域内单例,为每个作用域创建一个服务实例。
Transient 瞬态,从服务容器每次获取都创建一个新的实例。
3 用例服务
image.pngpublic 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);
}