本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
摘錄自2020年2月6日ETtoday新聞雲報導
澳洲昆士蘭洲近日有25萬到30萬隻的黑狐蝠因為大火的關係,從牠們棲息的山洞逃出,湧入澳洲的各個城市。澳洲的黑狐蝠長著「狗頭」,翅膀展開可達1.5米,有「毒王」之稱,領地意識相當強,連人類的脖子都可以咬斷。
綜合外媒報導,這次大約有30萬隻蝙蝠,從澳洲昆士蘭州的多個城市上空飛過,逃往它們適合生存的地方,頓時整個城市上空佈滿了黑壓壓的蝙蝠隊伍。由於蝙蝠實在太多了,還導致一架醫療救援直升機不敢降落。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益
摘錄自2020年02月07日中央通訊社澳洲報導
澳洲今(7日)傾盆大雨,為終止前所未見的野火危機帶來希望,雨水澆熄了失控延燒數個月的火勢,但也讓當局擔心隨之而來的水災。
災情最嚴重的新南威爾斯州(New South Wales)本週稍早部分地區開始降雨,並預計會持續至下週,料將澆熄數場剩餘大火,並有助於控制其他火勢。
到今天下午,新南威爾斯州沒有最危險緊急狀況或「注意和須採取行動」等級的野火,是將近半年未曾見過的狀況。
不過,隨著野火危機消退,當局現在準備可能發生的水災。澳洲氣象局(Australian Bureau of Meteorology)發布一系列水災警告,並表示新南威爾斯部分地區將出現4年來最大降雨。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!
摘錄自2020年02月07日中央通訊社葉門報導
葉門內戰造成數以百萬計平民每天為生存掙扎,而被忽視的動物園中動物,包括獅子、豹和狒狒,也面對不確定的未來。葉門首都沙那(Sanaa)在2014年遭到伊朗支持的葉門叛軍青年運動(Houthi)攻佔,青年運動控制葉門北部許多地區。
在沙那主要動物園,一名男子每天卸下用卡車載來的12頭死驢,餵食動物園中31頭獅子。照顧獅子的馬吉迪(al-Majdi)說,一些動物已經餓死,包括四頭在2017年死去的獅子。馬吉迪告訴法新社:「我們從葉門的各個省進口肉,但因為驢子的價格上漲,我們正疲於應付。」
就像葉門的其他地方,數以百萬計平民在五年來的內戰下瀕臨饑荒,動物園1159隻動物,包括兩頭嚴重瀕臨絕種阿拉伯豹,也在饑荒邊緣。
為這些動物奮鬥的人,包括同一世界演員動物救援基金會發起人柏德瑞(Kim-Michelle Broderick),這個基金會為葉門動物園動物募款。
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
據北京市科委消息,截至2015年年底,北京共建成公用充電樁5008根,2016年將再建5000根。
日前,“電動社區”行動計畫暨北京市充電設施公共服務管理平臺(e充網)啟動,將選擇500家社區率先實現電源條件到車位,並在無充電樁安裝條件社區率先投放500台移動充電車。
北京市“電動社區”行動計畫對於三類情況不同的社區給出了三種解決方案:對於有固定停車位元且具備電容量的社區,遴選500家,率先實現電源條件到車位;對於無固定停車位的社區,鼓勵在公共管理區域率先建設公用充電樁;在無充電樁安裝條件的社區,將投放500台移動充電車,方便車主預約充電車到車位充電,其投放範圍覆蓋北京16區中包括老舊社區、保障房社區、大型居住社區等各類社區200個。
公用充電樁將實現手機支付
據e充網工作人員表示,目前e充網已經實現了北京地區建設運營商全納入,全市所有公用充電樁的位置與導航資訊均收入到了APP之中。
此外,在充電樁國標符合性改造的過程中,統一支付結算(支持支付寶、微信、銀聯)、即時資料更新、充電樁預約等功能也會同步實施,即充電樁升級一批,其即時資料、統一支付結算等功能便實現一批,到今年6月底,電動汽車車主可以從“多卡不通用”的困境中解放出來,用手機實現線上查詢支付等諸多功能。
e充網工作人員介紹,目前北京已有604根快充樁(直流樁)實現了統一支付結算、即時資料更新的功能。
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益
中汽協日前預測,2016年全國電動汽車和插電式混合動力車的銷量預計將超過70萬輛,較2015年的銷量增長一倍。
2015年電動車和插電式混合動力車的合併銷量為331092輛,較2014年增長了340%。其中包括247482輛電動車和83610輛插電式混合動力車,在24萬輛多的電動汽車銷量中,包括146719輛乘用車,另有100763輛為商用車。插電式混合動力車的銷量中,60663輛為乘用車,22947輛為商用車。
根據2015年起草的藍圖,政府計畫到2020年在全國範圍內新建12000個充電站和480枚充電樁。2014年年底,全國共有780個充電站共31000枚充電樁。2015年政府還為27個省市自治區設定了電動車的最低銷量目標。
政府預計,這些措施到位後,自主品牌車企的電動車和插電式混合動力車銷量到2020年可達100萬輛,到2025年可達300萬輛。
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!
![]() |
國際車商BMW推出的電動車i3是目前市面上體型最小的電動車款之一,續航力相對也較差。據傳,今年i3將進行部份改版,讓續航力從目前的81英哩(129公里)延長48%到120英哩(192公里)。
《自由時報》指出 ,BMW的市場及銷售主任Ian Robertson在接受媒體採訪時,表示i3今年將有小改版的計畫。但除了續航力之外,並未說明外型與其他設計是否會有更動。
i3 電動版目前最高時速為150公里,0至100公里加速時間為7.2秒,屬於性能較佳的房車。此外,i3有純電版與油箱版,當電池耗盡後可用9公升的油箱開車到充電樁地點。
(照片來源:BWM 官網)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
Spring Security的登錄驗證流程核心就是過濾器鏈。當一個請求到達時按照過濾器鏈的順序依次進行處理,通過所有過濾器鏈的驗證,就可以訪問API接口了。
SpringSecurity提供了多種登錄認證的方式,由多種Filter過濾器來實現,比如:
根據我們不同的需求實現及配置,不同的Filter會被加載到應用中。
我們就以用戶名、密碼登錄方式為例講解一下Spring Security的登錄認證流程。
該過濾器封裝用戶基本信息(用戶名、密碼),定義登錄表單數據接收相關的信息。如:
UsernamePasswordAuthenticationFilter繼承自抽象類AbstractAuthenticationProcessingFilter,該抽象類定義了驗證成功與驗證失敗的處理方法。
也就是說當我們需要自定義驗證成功或失敗的處理方法時,要去實現AuthenticationSuccessHandler或AuthenticationfailureHandler接口
ProviderManager用繼承於AuthenticationManager是登錄驗證的核心類。ProviderManager保管了多個AuthenticationProvider,用於不同類型的登錄驗證。比如:
public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean {
……
private List<AuthenticationProvider> providers;
……
下文是ProviderManager的核心源碼,遍歷不同登錄驗證的AuthenticationProvider,只有當這種方式被支持的時候,才執行具體的登錄驗證邏輯。
public interface AuthenticationProvider {
Authentication authenticate(Authentication var1) throws AuthenticationException;
boolean supports(Class<?> var1);
}
AuthenticationProvider的實現類定義了具體的登錄驗證邏輯
public class DaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
從數據庫獲取用戶信息源碼
所以當我們需要加載用戶信息進行登錄驗證的時候,我們需要實現UserDetailsService接口,重寫loadUserByUsername方法,參數是用戶輸入的用戶名。返回值是UserDetails。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益
.NET Core具有一個承載(Hosting)系統,承載需要在後台長時間運行的服務,一個ASP.NET Core應用僅僅是該系統承載的一種服務而已。承載系統總是採用依賴注入的方式來消費它在服務承載過程所需的服務。對於承載系統來說,原始的服務註冊總是體現為一個IServiceCollection集合,最終的依賴注入容器則體現為一個IServiceProvider對象,如果要將第三方依賴注入框架整合進來,就需要利用它們解決從IServiceCollection集合到IServiceProvider對象之間的適配問題。
具體來說,我們可以在IServiceCollection集合和IServiceProvider對象之間設置一個針對某個第三方依賴注入框架的ContainerBuilder對象。我們先利用包含原始服務註冊的IServiceCollection集合來創建一個ContainerBuilder對象,再利用該對象來構建作為依賴注入容器的IServiceProvider對象。
如上圖所示的兩種轉換是利用一個IServiceProviderFactory<TContainerBuilder>對象完成的。如下面的代碼片段所示,IServiceProviderFactory<TContainerBuilder>接口定義了兩個方法,其中CreateBuilder方法利用指定的IServiceCollection集合創建出對應的ContainerBuilder對象,而CreateServiceProvider方法則進一步利用這個ContainerBuilder對象創建出作為依賴注入容器的IServiceProvider對象。
public interface IServiceProviderFactory<TContainerBuilder> { TContainerBuilder CreateBuilder(IServiceCollection services); IServiceProvider CreateServiceProvider(TContainerBuilder containerBuilder); }
.NET Core的承載系統總是利用註冊的IServiceProviderFactory<TContainerBuilder>服務來創建最終作為依賴注入容器的IServiceProvider對象。承載系統默認註冊的是如下這個DefaultServiceProviderFactory類型。如下面的代碼片段所示,DefaultServiceProviderFactory對象會直接調用指定IServiceCollection集合的BuildServiceProvider方法創建出對應的IServiceProvider對象。
public class DefaultServiceProviderFactory : IServiceProviderFactory<IServiceCollection> { public DefaultServiceProviderFactory() : this(ServiceProviderOptions.Default){} public DefaultServiceProviderFactory(ServiceProviderOptions options) =>_options = options; public IServiceCollection CreateBuilder(IServiceCollection services) => services; public IServiceProvider CreateServiceProvider( IServiceCollection containerBuilder) => containerBuilder.BuildServiceProvider(_options); }
為了讓讀者朋友對利用註冊的IServiceProviderFactory<TContainerBuilder>服務整合第三方依賴注入框架具有更加深刻的理解,我們來演示一個具體的實例。我們在《》創建了一個名為Cat的“迷你版”依賴注入框架,接下來我們將提供一個具體IServiceProviderFactory<TContainerBuilder>實現類型完成對它的整合。
我們首先創建一個名為CatBuilder的類型作為對應的ContainerBuilder。由於需要涉及針對服務範圍的創建,我們在CatBuilder類中定了如下兩個內嵌的私有類型,其中表示服務範圍的ServiceScope對象實際上就是對一個IServiceProvider對象的封裝,另一個ServiceScopeFactory類型表示創建該對象的工廠,它是對一個Cat對象的封裝。
public class CatBuilder { private class ServiceScope : IServiceScope { public ServiceScope(IServiceProvider serviceProvider) => ServiceProvider = serviceProvider; public IServiceProvider ServiceProvider { get; } public void Dispose()=> (ServiceProvider as IDisposable)?.Dispose(); } private class ServiceScopeFactory : IServiceScopeFactory { private readonly Cat _cat; public ServiceScopeFactory(Cat cat) => _cat = cat; public IServiceScope CreateScope() => new ServiceScope(_cat); } }
一個CatBuilder對象是對一個Cat對象的封裝,它的BuildServiceProvider方法會直接返回這個Cat對象,並作為最終提供的依賴注入容器。CatBuilder在初始化過程中添加了針對IServiceScopeFactory接口的服務註冊,具體註冊的是根據作為當前子容器的Cat對象創建的ServiceScopeFactory對象。為了實現程序集範圍內的批量服務註冊,我們為CatBuilder定義了一個Register方法。
public class CatBuilder { private readonly Cat _cat; public CatBuilder(Cat cat) { _cat = cat; _cat.Register<IServiceScopeFactory>( c => new ServiceScopeFactory(c.CreateChild()), Lifetime.Transient); } public IServiceProvider BuildServiceProvider() => _cat; public CatBuilder Register(Assembly assembly) { _cat.Register(assembly); return this; } ... }
如下所示的CatServiceProviderFactory類型實現了IServiceProviderFactory<CatBuilder>接口。在實現的CreateBuilder方法中,我們創建了一個Cat對象,並將指定IServiceCollection集合包含中的服務註冊(ServiceDescriptor對象)轉換成兼容Cat的服務註冊(ServiceRegistry對象)並應用到創建的Cat對象上。我們最終利用這個Cat對象創建出返回的CatBuilder對象。實現的另一個方法CreateServiceProvider返回的是調用CatBuilder對象的CreateServiceProvider方法得到的IServiceProvider對象。
public class CatServiceProviderFactory : IServiceProviderFactory<CatBuilder> { 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) { cat.Register(service.ServiceType, service.ImplementationInstance); } else { cat.Register(service.ServiceType, service.ImplementationType, service.Lifetime.AsCatLifetime()); } } return new CatBuilder(cat); } public IServiceProvider CreateServiceProvider(CatBuilder containerBuilder) => containerBuilder.BuildServiceProvider(); }
Cat具有.NET Core依賴注入框架一致的服務生命周期表達方式,所以我們在將服務註冊從ServiceDescriptor類型轉化成ServiceRegistry類型時,可以實現直接完成兩種生命周期模式的轉換,具體的轉換實現在如下這個AsCatLifetime擴展方法中。
internal static class Extensions { public static Lifetime AsCatLifetime(this ServiceLifetime lifetime) { return lifetime switch { ServiceLifetime.Scoped => Lifetime.Self, ServiceLifetime.Singleton => Lifetime.Root, _ => Lifetime.Transient, }; } }
接下來我們演示如何利用CatServiceProviderFactory來創建作為依賴注入容器的IServiceProvider對象。我們定義了如下的接口和對應的實現類型,其中Foo、Bar、Baz和Qux類型分別實現了對應的接口IFoo、IBar、IBaz和IQux,其中Qux類型上標註了一個MapToAttribute特性註冊了與對應接口IQux之間的映射。為了反映Cat對服務實例生命周期的控制,我們讓它們派生於同一個基類Base。Base實現了IDisposable接口,我們在其構造函數和實現的Dispose方法中輸出相應的文本以確定對應的實例何時被創建和釋放。
public interface IFoo {} public interface IBar {} public interface IBaz {} public interface IQux {} public interface IFoobar<T1, T2> {} public class Base : IDisposable { public Base() => Console.WriteLine($"Instance of {GetType().Name} is created."); public void Dispose() => Console.WriteLine($"Instance of {GetType().Name} is disposed."); } public class Foo : Base, IFoo{ } public class Bar : Base, IBar{ } public class Baz : Base, IBaz{ } [MapTo(typeof(IQux), Lifetime.Root)] public class Qux : Base, IQux { } public class Foobar<T1, T2>: IFoobar<T1,T2> { public IFoo Foo { get; } public IBar Bar { get; } public Foobar(IFoo foo, IBar bar) { Foo = foo; Bar = bar; } }
在如下所示的演示程序中,我們創建了一個ServiceCollection集合,並採用三種不同的生命周期模式分別添加了針對IFoo、IBar和IBaz接口的服務註冊。我們接下來根據這個ServiceCollection集合創建了一個CatServiceProviderFactory對象,並調用其CreateBuilder方法創建出對應的CatBuilder對象。我們隨後調用了CatBuilder對象的Register方法完成了針對當前入口程序集的批量服務註冊,其目的在於添加針對IQux/Qux的服務註冊。
class Program { static void Main() { var services = new ServiceCollection() .AddTransient<IFoo, Foo>() .AddScoped<IBar>(_ => new Bar()) .AddSingleton<IBaz>(new Baz()); var factory = new CatServiceProviderFactory(); var builder = factory.CreateBuilder(services) .Register(Assembly.GetEntryAssembly()); var container = factory.CreateServiceProvider(builder); GetServices(); GetServices(); Console.WriteLine("\nRoot container is disposed."); (container as IDisposable)?.Dispose(); void GetServices() { using (var scope = container.CreateScope()) { Console.WriteLine("\nService scope is created."); var child = scope.ServiceProvider; child.GetService<IFoo>(); child.GetService<IBar>(); child.GetService<IBaz>(); child.GetService<IQux>(); child.GetService<IFoo>(); child.GetService<IBar>(); child.GetService<IBaz>(); child.GetService<IQux>(); Console.WriteLine("\nService scope is disposed."); } } } }
在調用CatServiceProviderFactory對象的CreateServiceProvider方法創建出作為依賴注入容器的IServiceProvider對象之後,我們先後兩次調用了本地方法GetServices方法。GetServices方法會利用這個IServiceProvider對象創建一個服務範圍,並利用此服務範圍內的IServiceProvider提供兩組服務實例。通過CatServiceProviderFactory創建的IServiceProvider對象在最終通過調用其Dispose方法進行釋放。該程序運行之後會在控制台上輸出如圖4-16所示的結果,輸出結果體現的服務生命周期與演示程序體現的是完全一致的。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!