Важно посмотреть на это с точки зрения класса, который зависит от IFooModel
Это, вероятно, первое место, где вы хотите предотвратить связь.
Это можно сделать, введя фабрику вКласс, который нуждается в этом, например:
public class NeedsFooFactory
{
private readonly IFooBarFactory _factory;
public NeedsFooFactory(IFooBarFactory fooBarFactory)
{
_factory = factory;
}
public void WhatEverThisClassDoes(IFoo foo)
{
var fooBar = _factory.Create(foo);
// Do something
}
}
Теперь класс, который зависит от фабрики, отделен от любой реализации.Вы можете заменить или смоделировать другую реализацию фабрики, которая возвращает другую реализацию IFooModel
.
Что-то, на чем стоит остановиться и подумать на этом этапе: вам вообще нужна абстракция для ConcreteFooModel
?Если это просто класс, который содержит данные, то, возможно, вы этого не сделаете.
Возвращение к фабрике: теперь, когда вы можете заменить фабрику любой реализацией, это становится менее важным:
public class FooBarFactory : IFooBarFactory
{
public IFooModel Create(IFoo someClass)
{
// some complex model building code here
IBarData barData = new ConcreteBarData();
IFooModel model = new ConcreteFooModel(someClass.data1, someClass.data1, barData);
}
}
Эта реализация фабрики возвращает конкретную конкретную реализациюIFooModel
.Это плохо?На каком-то уровне классы собираются заниматься конкретными классами.В этом случае я думаю, что все в порядке, потому что этот завод делает то, что должен делать.Вам не нужно беспокоиться, что это связано с ConcreteFooModel
.Если вам нужен класс, который возвращает другую реализацию, вы можете создать другую реализацию IFooBarFactory
, которая возвращает другую реализацию IFooModel
.
Опять же, это становится еще менее важным, если вы сомневаетесь,нужна абстракция для вашей модели foo.Вполне возможно, что конкретный класс - это все, что вам нужно, и важно то, что у вас могут быть различные реализации фабрики, которая его заполняет.