一段代碼 問題 依賴具體Log4NetServices,要換成FileLogServices就要改 依賴 依賴就是 變形: 這樣在實際使用中,不用管ILogServices的實現,由Shop的構造函數負責給具體實現 問題 Shop本身也不知道是用Log4NetServices還是FileLogSer ...
一段代碼
class Program
{
static void Main(string[] args)
{
var shop=new Shop();
shop.Add();
shop.Delete();
Console.ReadKey();
}
}
class Shop
{
readonly Log4NetServices _logServices;
public Shop()
{
_logServices = new Log4NetServices();
}
public void Add()
{
_logServices.Write("增加商品");
}
public void Delete()
{
_logServices.Write("刪除商品");
}
}
問題
- 依賴具體Log4NetServices,要換成FileLogServices就要改
依賴
依賴就是依賴抽象
變形:
readonly ILogServices _logServices;
這樣在實際使用中,不用管ILogServices的實現,由Shop的構造函數負責給具體實現
問題
- Shop本身也不知道是用Log4NetServices還是FileLogServices,但使用者肯定是知道的。
註入
註入就是將你需要的東西傳給你,不用你自己new
變形:
class Program
{
static void Main(string[] args)
{
var shop=new Shop(new Log4NetServices());
shop.Add();
shop.Delete();
shop=new Shop(new FileLogServices());
shop.Add();
shop.Delete();
Console.ReadKey();
}
}
class Shop
{
readonly ILogServices _logServices;
public Shop(ILogServices logServices)
{
_logServices = logServices;
}
public void Add()
{
_logServices.Write("增加商品");
}
public void Delete()
{
_logServices.Write("刪除商品");
}
}
問題:
- 需要的人多了,我一個個new?
- 需要的種類多了,我一個個new?
- 能不能把new的東西放一起,需要的人統一從裡面拿。
IOC
dotnetcore 的ioc示例
class Program
{
static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<ILogServices, Log4NetServices>();
var serviceProvider = serviceCollection.BuildServiceProvider();
var logServices = serviceProvider.GetService<ILogServices>();
var shop = new Shop(logServices);
shop.Add();
shop.Delete();
Console.ReadKey();
}
}