У меня есть два класса: сервер и клиент. Серверу необходимо создать экземпляр клиента в нескольких потоках, а у Клиента есть виртуальный член, который должен предоставить пользовательскую реализацию. Мой вопрос. Если класс 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));
}
}
}
Test Program ... вы бы пошагово, чтобы он попал в CustomClient
class Program
{
static void Main(string[] args)
{
Func<CustomClient> factory =() => new CustomClient();
var server = new Server(factory);
server.DoWork();
}
}
Если серверу необходимо создать клиент, я бы передал ему заводский метод для его использования. Поэтому я бы пошел на инъекцию зависимости. –
Вы можете передать зависимость в (SRP), но она не должна быть интерфейсом для запуска. –
Так что скажем, я использую DI. Как это работает, если класс Client должен быть более или менее абстрактным классом? У меня был бы интерфейс, позволяющий сказать IClient, а затем абстрактный класс, который наследует от IClient, который имеет свою реализацию по умолчанию. Как я уже сказал, он имеет множество частных методов, которые не будут меняться только с одним виртуальным методом. Можно ли использовать DI в подклассе абстрактного класса, который наследуется от интерфейса? – ewahner