我有兩個類,服務器和客戶端。服務器需要在多個線程中實例化客戶端,並且客戶端有一個需要提供自定義實現的虛擬成員。我的問題是。如果Client類是Server類的嵌套類,或者我應該使用接口和依賴注入來將自定義實現引入Server類。現在Client類還有許多私有方法提供了一些不應該改變的標準邏輯。我應該使用嵌套類還是IoC容器?
public class Server
{
public void DoWork()
{
for (var i = 0;i < 10; i++)
{
Client client = new Client();
client.Process(i);
}
}
}
public class Client
{
private void doSomething()
{
...
}
// Needs to be overridden and provide custom logic
public virtual string Process(int i)
{
return i.ToString();
}
}
工作例如:
public interface IClient
{
string Process(string message);
}
public abstract class Client : IClient
{
public virtual string Process(string message)
{
return message;
}
}
public class CustomClient : Client
{
public CustomClient() { }
public override string Process(string message)
{
return string.Format("Custom Client:{0}", message);
}
}
public class Server
{
private Func<IClient> createClient;
public Server() { }
public Server(Func<IClient> client)
{
createClient = client;
}
public void DoWork()
{
for (var i = 0; i < 10; i++)
{
IClient = client = createClient();
client.Process(string.Format("Client #{0}", i));
}
}
}
測試計劃......你會步,看它擊中一個CustomClient
class Program
{
static void Main(string[] args)
{
Func<CustomClient> factory =() => new CustomClient();
var server = new Server(factory);
server.DoWork();
}
}
如果服務器需要創建一個客戶端,我會傳遞一個工廠方法到服務器供它使用。所以我會去依賴注入。 – 2013-04-06 16:58:30
您可以在(SRP)中傳遞依賴關係,但它不一定是要啓動的接口。 – 2013-04-06 16:59:19
因此可以說我使用DI。如果Client類需要或多或少是一個抽象類,那麼這將如何工作?我會有一個接口讓我們說IClient,然後是一個繼承自IClient的抽象類,它有默認的實現。正如我所說,它有很多私有方法,不會因爲只有一種虛擬方法而改變。我可以在從接口繼承的抽象類的子類上使用DI嗎? – ewahner 2013-04-06 17:18:13