Строительный комплекс данных класса - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий конструктор / фабрика, которая абстрагирует сериализуемую модель из класса.

public class FooBarFactory : IFooBarFactory
{
    public IFooModel Create(IFoo someClass)
    {
        // some complex model building code here
    }
}

И у меня есть конкретная реализация IFooModel, например, так:

public interface IFooModel
{
    string AbstractedData1 { get; }
    string AbstractedData2 { get; }
    int AbstractedData3 { get; }
}

public class ConcreteFooModel : IFooModel
{
    public string AbstractedData1 { get; set; }
    public string AbstractedData2 { get; set; }
    public int AbstractedData3 { get; set; }
    public bool ExtraData1 { get; set; }
}

Теперь возникаетпроблема, я изо всех сил пытаюсь найти способ не ссылаться на какие-либо конкретные реализации в моем методе конструктора / фабрики, например

public class FooBarFactory : IFooBarFactory
{
    public IFooModel Create(IFoo someClass)
    {
        // some complex model building code here
        var model = new ConcreteFooModel(someClass.data1, someClass.data1); // Aaargh
    }
}

Что-то в этом коде вонючее для меня, возможно, это единственный способ, ноМне не нравится идея принудительного обращения к конкретной реализации для создания экземпляра класса данных, IFooModel.

Это становится более сложным, если я сейчас введу другой интерфейс держателя данных в IFooModel

public interface IFooModel
{
    string AbstractedData1 { get; }
    string AbstractedData2 { get; }
    int AbstractedData3 { get; }
    IBarData BarData { get; }
}

public interface IBarData
{
    // some data in here
}

Вынудив меня затем создать еще одну конкретную ссылку для вложенного интерфейса

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);
    }
}

Есть ли лучший способ сделать это, все еще придерживаясь принципов SOLID и IoC?

1 Ответ

0 голосов
/ 29 ноября 2018

Важно посмотреть на это с точки зрения класса, который зависит от 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.Вполне возможно, что конкретный класс - это все, что вам нужно, и важно то, что у вас могут быть различные реализации фабрики, которая его заполняет.

...