程式猿多個物件的友好管理方式IOC容器
阿新 • • 發佈:2021-10-15
大部分程式猿都有物件太多不好管理的煩惱,這裡推薦使用物件容器進行管理,在需要某個物件的時候,CALL它;
使用IOC容器的好處是:解耦了物件之間的強耦合,規範了使用物件的生命週期 缺點:IOC內部使用反射的方式建立物件,會有一定的效能損耗;
下面用以前用過的物件容器SimpleInjector 舉個栗子:
前期工作: 先使用NuGet引入SimpleInjector 包;
由於是面向藉口程式設計,所以每個物件都需要介面
//容器物件 public class SimpleInjectorDependencyResolver : IDependencyResolver {View Codeprivate static readonly Container _container = new Container(); public object Container { get { return _container; } } public T Resolve() where T : class { return _container.GetInstance(); } public object Resolve(Type type) {return _container.GetInstance(type); } public Lazy LazyResolve() where T : class { return new Lazy(() => { return Resolve(); }); } }
初始化類註冊物件到容器;物件的生命週期: Lifestyle. Scoped :一生一個物件 Transient:每次都是一個新物件 Singleton:單身 publicView Codepartial class IocConfig { public Container _container = (Container)Engine.Resolver.Container; private void System() { _container.Register < IDbContext>(() => { return new PSADataEntities(DBFactory.ConnectionString); },Lifestyle.Scoped); _container. Register< IUnitOfWork, UnitOfWork> (); _container.Register(typeof(IGenericRepository<>), typeof(GenericRepository<>)); } } 取物件 public class SomeService : BaseService, IBinLocationService { private IGenericRepository _BinLocationReposity; public IGenericRepository BinLocationReposity { get { if (null == _BinLocationReposity) { _BinLocationReposity = Engine.Resolver.Resolve< IGenericRepository< SYS_LOCATION >>(); } return _BinLocationReposity; } } }
希望幫到了各位有很多物件的程式設計師們