Вернуть IList <T>из DAL - PullRequest
       80

Вернуть IList <T>из DAL

0 голосов
/ 30 апреля 2020

Я пишу небольшое приложение, чтобы вернуть информацию о телешоу (и попрактиковаться в дизайне). У меня проблемы с пониманием, где go с этого момента. Ожидание довольно простое; на основе того, что шоу передается в мой контроллер, передать его в BLL и DAL и обратно. Тем не менее, я пойман в сорняках реализации с использованием обобщений.

(Комментарии в коде также освещают проблемы)

Контроллер:

Потому что я Я не знаю, какой тип будет передан в BLL. Я не могу инициализировать экземпляр BLL. Это недостаток дизайна с моей стороны?

BLL:

GetAllEpisodes не может вывести переменную StarTrekEpisode; думал, что я попробовал пройти в классе, черт возьми, но это, очевидно, не работает

DAL:

Когда я дохожу до этого момента, мне интересно действительно возможно вернуть индивидуальное шоу на основе параметра. Проблема в том, что все объекты эпизода в определенной степени различаются.

Общие сведения:

Я столкнулся с ограничением в целом или только с моим дизайном? Лучше просто иметь контроллер для каждого телешоу? KISS?

IEpisode:

public interface IEpisode
{
    public int Id { get; set; }
    public int NumberOverall { get; set; }
    public int NumberInSeason { get; set; }
    public string Title { get; set; }
    public DateTime AirDate { get; set; }
    public string DirectedBy { get; set; }
    public double NumberOfUSViewers { get; set; }
}

StarTrekEpisode:

public class StarTrekEpisode : IEpisode
{
    public int Id { get; set; }
    public int NumberOverall { get; set; }
    public int NumberInSeason { get; set; }
    public string Title { get; set; }
    public DateTime AirDate { get; set; }
    public string DirectedBy { get; set; }
    public double NumberOfUSViewers { get; set; }


    public string StarDate { get; set; }
}

SeinfieldEpisode:

public class SeinfieldEpisode : IEpisode
{
    public int Id { get; set; }
    public int NumberOverall { get; set; }
    public int NumberInSeason { get; set; }
    public string Title { get; set; }
    public DateTime AirDate { get; set; }
    public string DirectedBy { get; set; }
    public double NumberOfUSViewers { get; set; }


    public int Ranking { get; set; }
}

EpisodeController:

[Route("[controller]")]
[ApiController]
public class EpisodeController : ControllerBase
{
    public BLL BLL { get; set; }; // Using the generic type 'BLL<T>' requires 1 type argument (but I don't know the type yet...)

    public EpisodeController()
    {
        //BLL = new BLL(); // same error as above
        BLL = Activator.CreateInstance(typeof(T)); // ...T could not be found
    }

    [HttpGet("{show}")]
    public IActionResult GetAllEpisodes(string show)
    {
        BLL.GetAllEpisodes(show); // 'BLL' does not contain a definition for 'GetAllEpisodes' and no accessible extension method 'GetAllEpisodes' accepting a first argument of type 'BLL' could be found
        return Ok("All"); 
    }
}

BLL:

public class BLL<T> : IBLL<T> where T : class
{
    DAL DAL = new DAL();

    public IList<T> GetAllEpisodes(string show)
    {
        StarTrekEpisode ste = new StarTrekEpisode();
        SeinfieldEpisode se = new SeinfieldEpisode();
        switch(show)
        {
            case "TNG":
                return DAL.GetAllEpisodes(ste); // The type arguments for method 'DAL.GetAllEpisodes<T>(IEpisode)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 
            case "SE":
                return DAL.GetAllEpisodes(SeinfieldEpisode); // (obviously won't work...) 'SeinfieldEpisode' is a type, which is not valid in the given context
            default:
                break;
        }

    }

}

DAL:

public List<T> GetAllEpisodes<T>(IEpisode show) where T : class
{
    List<T> episodes = new List<T>();
    try
    {
        using (SqlConnection con = new SqlConnection(ConnectionString))
        {
            con.Open();
            using (SqlCommand command = new SqlCommand("GetAllEpisodes", con))
            {
                command.CommandType = CommandType.StoredProcedure;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        episodes.Add(
                           // return all columns and fill in based on T?
                        );
                    }
                    return episodes;
                }
            }
        }
    }
    catch (Exception ex)
    {
        return episodes;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...