2012-01-14 20 views
8

Yürütülen yöntemin sonucu alın Şu anda basit bir sınama projesinde Transaction Komut Dosyası modelini (tam olarak Martin Fowler described'u kullanarak nasıl çalıştırmaya çalışıyorum), her şey iyi çalışıyor, sorun şu ki burada sorun yok ICommand arabiriminden miras alınan somut sınıfta belirtilen metotla ne zaman sonuç alacağını bilmek.Komut Kalıbı

Hangi işlevselliğe sahip olduğumu netleştirmek için size bir kod gösterelim. Ben adlandırılmış CalculateSalaryTS O zamanlar, beton komut sınıfına örneğini geçmesi gördüğünüz gibi

public class CalculateSalaryTS { 
    public void CalculateSalary(int _hour, int _salaryPerHour) { 
     Result = _hour * _salaryPerHour; 
    } 
} 

iCommand arayüzüne

public class CalculateSalaryCommand : ICommand 
{ 
    private readonly CalculateSalaryTS _salaryTs; 
    private readonly int _hour; 
    private readonly int _salaryPerHour; 

    public CalculateSalaryCommand(CalculateSalaryTS salaryTs, int hour, int salaryPerHour) 
    { 
     _salaryTs = salaryTs; 
     _hour = hour; 
     _salaryPerHour = salaryPerHour; 
    } 

    public void Execute() 
    { 
     _salaryTs.CalculateSalary(_hour, _salaryPerHour); 
    } 
} 

ve basit İşlem Senaryo sınıfından miras basit CalculateSalaryCommand dersim var Execute yönteminin içinde bu örnekten bir işlem yürütüyorum. Eh, her şey güzel görünüyor. ama bir tamsayı olması gereken yürütülmüş yöntemin sonucunu döndüremediğim bir problem var.

:

Sonra
public interface ITransactionResult<TResult> 
{ 
    TResult Result { get; set; } 
} 

CalculateSalaryTS sınıfı bu hale geldi: Bu sorunu işlemek için ben aşağıdaki gibi görünecektir olan her bir işlem genel ITransactionResult arabiriminden miras gerektiğini İşlem Senaryo tabakasına bazı kodlar, eklemeye karar

public class CalculateSalaryTS : ITransactionResult<Int32> { 

    public void CalculateSalary(int _hour, int _salaryPerHour) { 
     Result = _hour * _salaryPerHour; 
    } 

    public int Result { get; set; } 

} 

Kullanımı:

var script = new CalculateSalaryTS(); 
    var command = new CalculateSalaryCommand(script, 10, 20);   
    command.Execute(); 
    Console.WriteLine("Salary is {0}", script.Result); 

Bu yolun kendi sınırlaması olduğunu biliyorum ama bu durumu ele almak için bana başka bir fikir verene kadar hiçbir seçeneğim yok.

Şimdiden teşekkürler.

cevap

18

yüzden:

public interface ICommandWithResult<T> : ICommand 
{ 
    T Result { get; } 
} 

public class CalculateSalaryCommand : ICommandWithResult<int> 
{ 
    public int Result { get; private set; } 

    // ... 

    public void Execute() 
    { 
    _salaryTs.CalculateSalary(_hour, _salaryPerHour); 
    this.Result = _salaryTs.Result; 
    } 
} 

// Usage: 

var command = new CalculateSalaryCommand(new CalculateSalaryTS(), 10, 20); 
command.Execute(); 
Console.WriteLine("Salary is {0}", command.Result); 
+0

Dennis Yanıt için teşekkürler. Harika bir çözüm seçtiniz. Fakat modelin konseptlerini tasarlamanın yeni olmasından dolayı, ICommand davranışına ek işlevsellik eklemek konusunda kafam karışıyor. Doğru mu? – saber

+2

Komutlarınızı gerektiği gibi genişletmenin bir sorun olduğunu düşünmüyorum. Tasarım Kalıpları, belirli ve yinelenen problemlerin nasıl çözüleceğine dair bir rehber niteliğindedir. Taşa değil, inşa edebileceğiniz bir temel oluşturuyorlar. Özel durumunuzda 'ICommandWithResult 'arayüzünü eklemeniz bile gerekmemektedir. ICommand'ı "Sonuç" özelliğini "CalculateSalaryClass" öğesine ekleyebilirsin. –

+0

+1 Teşekkürler Dennis. Iam – saber

4

Sanırım sonuç döndürme yeteneğine sahip bir komut deseni arıyorsunuz. kesinlikle komut yürütme hemen sonra sonuç almak gerekiyorsa, komut nesnesinde sonucunu saklamak olabilir

interface ICommand<TResult> 
    { 
     TResult Execute(); 
    } 


public class CalculateSalaryCommand : ICommand<int> 
{ 
    private readonly CalculateSalaryTS _salaryTs; 
    private readonly int _hour; 
    private readonly int _salaryPerHour; 

    public CalculateSalaryCommand(CalculateSalaryTS salaryTs, int hour, int salaryPerHour) 
    { 
     _salaryTs = salaryTs; 
     _hour = hour; 
     _salaryPerHour = salaryPerHour; 
    } 

    public int Execute() 
    { 
     return _salaryTs.CalculateSalary(_hour, _salaryPerHour); 
    } 
} 
+2

Komuta Desen yöntemi geçersiz olmalıdır, haydi Haklı olduğunuzu hayal edin, ne olursa olsun geçersiz bir yöntem uygulamak istiyorum. ne yapmalıyım ? – saber

+0

@SaberAmani: İki yol, null döndüren ICommand 'u uygular veya 'GetResult()' adlı bir yöntem/özellik kullanır. – Spoike