2012-06-05 9 views
6

Tengo alrededor de 20 funciones con casi el mismo patrón, ejecuto en una matriz de sitios, creo SiteOperation con el objeto Site y realizo alguna operación (en este caso con un param pero a veces no hay ninguno)función similar refactoring pattern

int wantedBandwidthInLBps = 2048/8; 
foreach (Sites site in _sitesManagement.GetAll()) 
{ 
SiteOperation siteOperation = new SiteOperation(site); 
siteOperation.LimitBandwidth(wantedBandwidthInLBps); 
} 

foreach (Sites site in _sitesManagement.GetAll()) 
{ 
SiteOperation siteOperation = new SiteOperation(site); 
siteOperation.KillJames(); 
} 

foreach (Sites site in _sitesManagement.GetAll()) 
{ 
SiteOperation siteOperation = new SiteOperation(site); 
siteOperation.FlyToMoon(2012, new TaskIdentifier(10,20)); 
} 

¿es posible envolver este código, por lo que sólo se enviará a la acción digamos _sitesManagement que se ejecutará esta acción en todos los sitios?

+3

puede publicar algunas de las otras funciones para que podamos ver exactamente lo que podría envolverse? – gingerbreadboy

+0

@gingerbreadboy, sure – eugeneK

Respuesta

4

Prueba esto:

void PerformOperationOnAllSites(Action<SiteOperation> doIt) { 
    foreach (Sites site in _sitesManagement.GetAll()) { 
     SiteOperation siteOperation = new SiteOperation(site); 
     doIt(siteOperation); 
    } 
} 

... 

_sitesManagement.PerformOperationOnAllSites(op => op.LimitBandwidth(wantedBandwidthInLBps)); 
_sitesManagement.PerformOperationOnAllSites(op => op.KillJames()); 
_sitesManagement.PerformOperationOnAllSites(op => op.FlyToMoon(2012, new TaskIdentifier(10,20)); 
+0

¿Me equivoco al decir que este método requerirá que obtenga SiteOperation como parámetro para cada método que tengo? – eugeneK

+0

hey there fingers rápidos: P – gingerbreadboy

+0

@eugeneK Este método pasará 'SiteOperation' a su * lambdas * como el único parámetro, por lo que su lambdas tendrá que operar en él, tal vez junto con algunos otros datos disponibles en el contexto de la llamada (como 'wantedBandwidthInLBps' en la primera llamada). – dasblinkenlight

1
public void DoSiteOperationActions(Action<SiteOperation> toDo) 
{ 
     foreach (Sites site in _sitesManagement.GetAll()) 
     { 
      SiteOperation mySiteOperation = new SiteOperation(site); 
      toDo(mySiteOperation); 
     } 
} 

y luego se le puede llamar como ...

DoSiteOperationActions(so => so.FlyToMoon(2012, new TaskIdentifier(10,20)));

La sintaxis podría ser un poco apagado, no tiene IDE aquí, pero más información aquí http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

0
private static void InvokeMethod(Action<SiteOperation> action) 
    { 
     foreach (SiteOperation siteOperation in _sitesManagement.GetAll() 
           .Select(site=>new SiteOperation(site)) 
     { 
      action(siteOperation); 
     } 
    } 
.. 

    public static void KillJames() 
    { 
     InvokeMethod(so => so.KillJames()); 
    } 

    public static void LimitBandwidth(int wantedBandwidthInLBps) 
    { 
     InvokeMethod(so => so.LimitBandwidth(wantedBandwidthInLBps)); 
    } 

    public static void FlyToMoon(int year=2012, TaskIdentifier ti=new TaskIdentifier(10,20)) 
    { 
     InvokeMethod(so => so.FlyToMoon(year, ti)); 
    }