我們有一個包含一些具有不同功能的程序集的庫。我們在我們爲客戶開發的任何前端項目中使用這個庫。假設我想在庫中執行特定的任務/方法,但是該方法的實現必須位於前端。在客戶端項目中實現庫方法
簡而言之:庫中的X類調用庫中類Y的方法A,但方法A需要在庫外部實現。怎麼樣?
我們有一個包含一些具有不同功能的程序集的庫。我們在我們爲客戶開發的任何前端項目中使用這個庫。假設我想在庫中執行特定的任務/方法,但是該方法的實現必須位於前端。在客戶端項目中實現庫方法
簡而言之:庫中的X類調用庫中類Y的方法A,但方法A需要在庫外部實現。怎麼樣?
您可以從您的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
}
消費者應該有尊重代表的簽名的方法,只是把它傳遞到庫在初始化階段。
將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());
}
}
希望有所幫助。也請看註釋者的建議:依賴注入。我只是現在正在研究(這可能是我剛剛描述的 - 不知道,需要研究!
看看依賴注入和應用程序組合 –