2012-07-04 21 views
2

我們有一個包含一些具有不同功能的程序集的庫。我們在我們爲客戶開發的任何前端項目中使用這個庫。假設我想在庫中執行特定的任務/方法,但是該方法的實現必須位於前端。在客戶端項目中實現庫方法

簡而言之:庫中的X類調用庫中類Y的方法A,但方法A需要在庫外部實現。怎麼樣?

+0

看看依賴注入和應用程序組合 –

回答

0

您可以從您的lib中公開一個委託並讓消費者將其指定爲指向他們自己的實現。

例子:

public delegate void DoWorkDelegate(CustomWorkParameters p); 

public DoWorkDelegate DoWorkCallback 
{ 
    get 
    { 
    return _workCallback; 
    } 
    set 
    { 
    _workCallback = value; 
    } 
} 

在你的lib,當你需要實際做的工作後來:

private void DoWorkInternal() 
{ 
    //Some work here 

    //Check if caller set the callback 
    if(_workCallback != null) 
    { 
    _workCallback(localWorkParameters); 
    } 
    else 
    { 
    //throw exception 
    } 
    //Some more work here 
} 

消費者應該有尊重代表的簽名的方法,只是把它傳遞到庫在初始化階段。

0

將ClassY定義爲Abstract類,要求消費者爲定義爲Abstract的方法提供實現。在ClassY基礎上定義的邏輯對於所有派生類都是通用的,而在ClassY基礎上定義爲「抽象」的方法將需要由每個派生類實現。注意我只是舉例說明了這一點,所以我沒有聲稱實際的代碼代表最佳實踐!

抽象基類:優等的

public abstract class AbstractLibraryClassY 
{ 
    private static int _multiplier = 0; 


    public abstract int MethodA(int SomeParam); 

    // A simple example Property defined and implemented on the Abstract base class: 
    public int Multiplier 
    { 
     get { return _multiplier; } 
     set { _multiplier = value; } 
    } 


    private void someclassYImplementationStuff() 
    { 
     // Other implementation code . . . 
    } 
} 

兩種可能的實現:

public class ConcreteClassYImplementationOne : AbstractLibraryClassY 
{ 
    public override int MethodA(int SomeParam) 
    { 
     return SomeParam * this.Multiplier; 
    } 
} 


public class ConcreteClassYImplementationTwo : AbstractLibraryClassY 
{ 
    public override int MethodA(int SomeParam) 
    { 
     return SomeParam * this.Multiplier + 5; 
    } 
} 

類X,消耗優雅的實例:

public class LibraryClassX 
{ 
    public int methodCallsClassYMethodA(AbstractLibraryClassY ImplementedClassY) 
    { 
     ImplementedClassY.Multiplier = 2; 
     return ImplementedClassY.MethodA(100); 
    } 
} 

一個簡單的示範,它使用類X按順序消耗ClassY的每個實現:

public class Consumer1 
{ 
    public void ConsumeClassX() 
    { 
     // Some hokey, arbitrary inputs: 
     int MyInput = 200; 
     int MyMultiplier = 2; 

     // Consume Library Class Y using ConcreteClassYImplementationOne: 
     AbstractLibraryClassY InstanceOf = new ConcreteClassYImplementationOne(); 
     InstanceOf.Multiplier = MyMultiplier; 

     // Will output 400, per implementation defined in ConcreteClassYImplementationOne: 
     Console.WriteLine("Output = " + InstanceOf.MethodA(MyInput).ToString()); 

     // Consume Library Class Y using ConcreteClassYImplementationTwo: 
     InstanceOf = new ConcreteClassYImplementationTwo(); 
     InstanceOf.Multiplier = MyMultiplier; 

     // Will output 405, per implementation defined in ConcreteClassYImplementationTwo: 
     Console.WriteLine("Output = " + InstanceOf.MethodA(MyInput).ToString()); 

    } 
} 

希望有所幫助。也請看註釋者的建議:依賴注入。我只是現在正在研究(這可能是我剛剛描述的 - 不知道,需要研究!