Я пишу небольшое приложение, чтобы вернуть информацию о телешоу (и попрактиковаться в дизайне). У меня проблемы с пониманием, где 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;
}
}