У меня возник вопрос о создании фабричного интерфейса с помощью метода create, который может обслуживать прием различных типов аргументов в зависимости от реализации.Factory Interface Create Method with object Аргумент
Чтобы дать вам немного больше фона, я использую зависимость в инъекции в проекте и требую, чтобы объекты с сохранением состояния генерировались во время выполнения - поэтому я создаю объекты, а не сами объекты, вместо самих объектов. Проблема, с которой я столкнулся, заключается в том, что для некоторых интерфейсов конкретные реализации просто не могут иметь одинаковые типы аргументов конструктора, поэтому фабрики, которые создают экземпляр этих интерфейсов, требуют почти «динамических» аргументов для передачи методу create.
Я занимаюсь этим в течение нескольких дней, и следующее - лучшее решение, которое я мог бы придумать (а именно, передать объект методу создания фабрики и направить его в конкретную реализацию фабрики) , Я действительно ищу отзывы от людей, которые раньше сталкивались с этим сценарием, чтобы узнать, что они придумали, и приемлемо ли решение, которое я предлагаю ниже.
Извините, если это отсутствует какая-либо информация, и большое спасибо!
//
// Types...
//
interface IDataStore
{
List<string> GetItems();
}
public class XmlDataStore : IDataStore
{
public XmlDataStore(XmlDocument xmlDoc)
{
// Initialise from XML Document...
}
public List<string> GetItems()
{
// Get Items from XML Doc...
}
}
public class SQLDataStore : IDataStore
{
public SQLDataStore(SqlConnection conn)
{
// Initialise from SqlConnection...
}
public List<string> GetItems()
{
// Get Items from Database Doc...
}
}
//
// Factories...
//
interface IDataStoreFactory
{
IDataStore Create(object obj);
}
class XmlDataStoreFactory : IDataStore
{
IDataStore Create(object obj)
{
// Cast to XmlDocument
return new XmlDataStore((XmlDocument)obj);
}
}
class SQLDataStoreFactory : IDataStore
{
IDataStore Create(object obj)
{
// Cast to SqlConnection
return new SQLDataStore((SqlConnection)obj);
}
}
Я думаю, что мы (почти) прошли полный круг здесь, так как конкретная реализация заводского интерфейса эффективно отличает общий тип (переданный методу create) к определенному типу. Я думаю, что моя первоначальная забота заключалась в том, что «литье» (то есть в моем примере, бросающее объект на определенный тип) было бы неодобрительно. Я чувствую, что должен отмечать это как ответ из-за ваших усилий (и того факта, что это правильный ответ), однако, если в конечном итоге мы закончим кастинг, я могу придерживаться своего подхода, поскольку он соответствует тому, как я издеваюсь над объектами, когда единица тестирование. – Orinoco
Я могу следить за вашими мыслями о полном круге. Но есть две большие различия. У вас теперь есть одна фабрика, а не фабрика по типу хранилища данных (фабрики в этом случае на самом деле являются фабричными методами в своем классе). Ваши отливки типа теперь находятся в одном месте, а именно на вашем заводе. Вся реализация хранилища данных проста и проста, и вы можете создавать их из любого места, используя конструкторы типа безопасного типа (в отличие от вашего предыдущего «объекта»). Если вы когда-либо используете контейнер DI, вы можете удалить отливки, и это изменение необходимо только в вашем заводском классе ==, совместимом с открытием/закрытием –