2012-11-22 4 views
2

필자가 작성중인 프로그램에서 엔터프라이즈 라이브러리의 Unity 블록을 사용하려고합니다.유니티 IOC 및 공장 패턴 및 저장소 패턴

하지만 나는 의존성 주입을 잘못 사용하고 있다고 생각합니다. 나는 어떤 사람이 올바른 방향으로 나를 가리킬 수 있는지 궁금 해서요.

static void Main(string[] args) 
     { 
       using (IUnityContainer container = new UnityContainer()) 
       { 
        InitialiseContainer(container); 
        DataCopierFactory dcFactory = new DataCopierFactory(); 

        ERunOptions dataCopierType = ExtractParams(args); 

        IDataCopier dataCopier = dcFactory.CreateDataCopier((int)dataCopierType, container); 
        dataCopier.DetectChanges(); 
        dataCopier.ParseData(); 
        dataCopier.CopyData(); 
       } 
      } 
     } 
//use the ioc container to register the EF context type to the repository interfaces.. 
     private static void InitialiseContainer(IUnityContainer container) 
     { 

      //add Extensions: 
      container.AddNewExtension<Interception>(); 

      //Licence Schedule 
      container.RegisterType<IEFContext, LTE_DownFromWeb_EFContext>("DataCopier.ScheduleDataCopier.Source"); 
      container.RegisterType<IEFContext, LTE_Licensing_EFContext>("DataCopier.ScheduleDataCopier.Destination"); 

      container.RegisterType<IRepositorySession>("Schedule_Source",new InjectionConstructor(container.Resolve<IEFContext>("DataCopier.ScheduleDataCopier.Source"))); 
      container.RegisterType<IRepositorySession>("Schedule_Destination",new InjectionConstructor(container.Resolve<IEFContext>("DataCopier.ScheduleDataCopier.Destination"))); 



     } 

그래서 기본적으로 DataCopier 공장 그래서 같은 DataCopier의 인스턴스를 생성합니다

DataCopierFactory :

 class ScheduleDataCopier : IDataCopier 
    { 
     private List<Site> _sites; 
     private List<SitesAndApparatuses> _scheduleList; 
     private IUnityContainer _container; 
     public ScheduleDataCopier(IUnityContainer container) 
     { 
      _container = container; 
      _scheduleList = new List<SitesAndApparatuses>(); 
     } 

     //check if new sites registration has arrived in tblSites on down from web db. 
     public bool DetectChanges() 
     { 
      using (var db = _container.Resolve<IRepositorySession>("Schedule_Source")) 
      { 
       SiteAudit lastSite = new SitesAuditRepository().GetLatest(); 
       var sitesRepo = new SitesRepository(); 
       var sites = sitesRepo.Where(x => x.SID > lastSite.SALatestSID); 

       if (sites.Count() < 1) 
       { 
        return false; 
       } 
       _sites = sites.ToList(); 
       db.Dispose(); 
      } 
      return true; 
     } 
     //parse the data into a list of object SitesAndApparatuses 
     public bool ParseData() 
     { 
      try 
      { 
       foreach (Site s in _sites) 
       { 
        var schedule = (SitesAndApparatuses)XmlObjectBuilder.Deserialize(typeof(SitesAndApparatuses), s.XMLFile); 
        schedule.acCode = s.Registration.RAcCode; 
        _scheduleList.Add(schedule); 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new NotImplementedException("HANDLE THIS SHIT!", ex); 
      } 
      return true; 
     } 

     public bool CopyData() 
     { 
      try 
      { 
       using (var db = _container.Resolve<IRepositorySession>("Schedule_Destination")) 
       { 
         var licensingScheduleRepo = new LicensingScheduleRepository(); 
         //some logic 
        db.Commit(); 
       } 
      } 
      catch (Exception ex) 
      { 
      } 
       return true; 
     } 
} 

두 번째 질문 : 데이터 복사기는 다음과 같습니다

//return a data copier that will transfer data from any DB to any other DB 
     public IDataCopier CreateDataCopier(int i, IUnityContainer container) 
     { 
      switch(i) 
      { 
       case 1: 
        return new ScheduleDataCopier(container); 

       default: 
        throw new InvalidOperationException("Parameter " + i + " does not exist"); 
      } 
     } 

, 나는 Datacopier 클래스에서 RepositorySession이라는 작업 단위를 th를 사용하여 해결합니다. e 통일 컨테이너 통과 ... 이것은 잘못된 접근이며, 왜 온라인에 대한 정보를 찾기 위해 고심하고 있습니까?

사람이 읽을 수있는 코드가 너무 많습니다.하지만 대답을 기다리고 있습니다! 사전에

감사 닐

답변

3

뭔가 같이 할 것 : 무엇 당신은 위의 일을하고있는 사이

container.RegisterType<IEFContext, LTE_DownFromWeb_EFContext>("Source"); 
container.RegisterType<IEFContext, LTE_Licensing_EFContext>("Destination"); 
container.RegisterType<IRepositorySession>("Source",new InjectionConstructor(new ResolvedParameter<IEFContext>("Source")); 
container.RegisterType<IRepositorySession>("Destination",new InjectionConstructor(new ResolvedParameter<IEFContext>("Destination"))); 
container.RegisterType<IDataCopier,ScheduleDataCopier>("0",new InjectionConstructor(new[] {new ResolvedParameter<IRepositorySession("Source"),new ResolvedParameter<IRepositorySesison>("Destination")})); 
//Now resolve 

ERunOptions dataCopierType = ExtractParams(args); 
IDataCopier dataCopier = container.Resolve<IDataCopier(dataCopierType.ToString()); 
dataCopier.DetectChanges(); 
dataCopier.ParseData(); 
dataCopier.CopyData(); 

DataCopier 클래스

class ScheduleDataCopier : IDataCopier 
{ 
    private List<Site> _sites; 
    private List<SitesAndApparatuses> _scheduleList; 
    private IRepositorySession _source; 
    private (IRepositorySession _destination; 

    public ScheduleDataCopier(IRepositorySession source, (IRepositorySession destination) 
    { 
     _source=source; 
     _destination=destination; 
     _scheduleList = new List<SitesAndApparatuses>(); 
    } 

    //check if new sites registration has arrived in tblSites on down from web db. 
    public bool DetectChanges() 
    { 
     SiteAudit lastSite = new SitesAuditRepository().GetLatest(); 
     var sitesRepo = new SitesRepository(); 
     var sites = sitesRepo.Where(x => x.SID > lastSite.SALatestSID); 

     if (sites.Count() < 1) 
     { 
      return false; 
     } 
     _sites = sites.ToList(); 
     _source.DoSomething(); 
     _source.CommitAndReleaseResources();//clean up but leave object reusable 
     return true; 
    } 

    //parse the data into a list of object SitesAndApparatuses 
    public bool ParseData() 
    { 
     try 
     { 
      foreach (Site s in _sites) 
      { 
       var schedule = (SitesAndApparatuses)XmlObjectBuilder.Deserialize(typeof(SitesAndApparatuses), s.XMLFile); 
       schedule.acCode = s.Registration.RAcCode; 
       _scheduleList.Add(schedule); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new NotImplementedException("HANDLE THIS SHIT!", ex); 
     } 
     return true; 
    } 

    public bool CopyData() 
    { 
     try 
     { 
      var licensingScheduleRepo = new LicensingScheduleRepository(); 
      //some logic 
      _desitnation.Commit(); 
     } 
     catch (Exception ex) 
     { 
      //handle exception 
     } 
     return true; 
    } 
} 

두 가지 주요 차이점을 Injection Parameters (ResolvedParameter 클래스)을 사용하여 필요할 때 객체의 인스턴스를 동적으로 확인합니다.

이렇게하면 Unity가 내 DI 프로세스를 수행 할 수있게되고, DataCopier를 해결할 수 있습니다. 다른 Datacopier를 추가하면 Unity에 새로운 DataCopier 유형을 적절한 ERunOptions 유형과 일치하는 이름으로 추가하면됩니다.

과 :

ERunOptions dataCopierType = ExtractParams(args); 
IDataCopier dataCopier = container.Resolve<IDataCopier(dataCopierType.ToString()); 
dataCopier.DetectChanges(); 
dataCopier.ParseData(); 
dataCopier.CopyData(); 

은 동일하게 유지하지만,

+0

너무 감사 ScheduledDataCopier 또는 RandomDataCopier을 처리 할 수 ​​있습니다. Theres는 지금까지 이것으로 얻고 있으며,이 답장은 한두 가지 문제를 해결했습니다. – niallNoigeallach