Ich verwende ASP.NET MVC4 mit Entity Framework 5.Ist es schlechte Praxis, nach ID innerhalb des Repository-Muster zu filtern
Im Wesentlichen alle Ergebnisse der Controller-Aktion filtert die db-Ergebnisse von der angemeldeten Benutzer Unternehmens-ID. Ich habe gerade angefangen, ein Repository-Muster zu implementieren, um die Modelle zurückzugeben, anstatt den DbContext direkt vom Controller zu filtern. (Übergeben der FirmenID in das Repository, um die Ergebnisse von Methoden zu filtern)
Ich habe das komische Gefühl, dass es eine schlechte Übung ist, dies zu tun, aber ich konnte keine Informationen zu diesem Thema finden. Ich werde unten eine grundlegende Version meines aktuellen Codes einfügen, ich würde jede Information darüber schätzen, ob es eine schlechte Übung ist oder nicht, und warum.
IBookingSystemRepository.cs
public interface IBookingSystemRepository : IDisposable
{
IEnumerable<Appointment> GetAppointments();
IEnumerable<Appointment> GetAppointments(bool includeDeleted);
IEnumerable<Client> GetClients();
IEnumerable<Client> GetClients(bool includeDeleted);
void Save();
}
BookingSystemRepository.cs
public class BookingSystemRepository : IBookingSystemRepository
{
private BookingSystemEntities db;
int CompanyID;
public BookingSystemRepository(BookingSystemEntities context, int companyID)
{
this.db = context;
this.CompanyID = companyID;
}
public IEnumerable<Appointment> GetAppointments()
{ return GetAppointments(false); }
public IEnumerable<Appointment> GetAppointments(bool includeDeleted)
{
return includeDeleted
? db.Appointments.Where(a => a.User.CompanyID == CompanyID)
: db.Appointments.Where(a => a.User.CompanyID == CompanyID && a.Deleted.HasValue);
}
public IEnumerable<Client> GetClients()
{ return GetClients(false); }
public IEnumerable<Client> GetClients(bool includeDeleted)
{
return includeDeleted
? db.Clients.Where(c => c.CompanyID == CompanyID)
: db.Clients.Where(c => c.CompanyID == CompanyID && c.Deleted.HasValue);
}
public void Save()
{
db.SaveChanges();
}
public void Dispose()
{
if (db != null)
db.Dispose();
}
}
TestController.cs
public class TestController : Controller
{
private BookingSystemEntities db = new BookingSystemEntities();
public ActionResult AppointmentsList()
{
var user = db.Users.Single(u => u.Email == User.Identity.Name);
IBookingSystemRepository rep = new BookingSystemRepository(db, user.CompanyID);
return View(rep.GetAppointments());
}
}
Vielen Dank im Voraus für Ihre Unterstützung :)
Vielen Dank für Ihre Hilfe und schnelle Antwort :) Ich habe nicht einmal daran gedacht, den Kontext zu filtern, bevor Sie ihn an das Repository übergeben, ich denke, Ihr Ansatz wird die Dinge für mich noch einfacher machen! Um nur zu verdeutlichen, meinst du für mich, eine neue DbContext-Klasse zu erstellen, die alle DbSets basierend auf einer an den Konstruktor übergebenen ID filtert? –
Das wäre eine interessante Idee. Es wäre schön, wenn du es schaffen würdest. Nein, ich dachte eher an eine Repository- oder DBContextWrapper-Klasse, die Ihr normales Repository füttern würde. Aus Sicherheitsgründen würde der beste Weg, den DBContext zu füttern, darin bestehen, Ansichten in Ihrer Datenbank-Engine bereitzustellen, die bereits gefiltert sind. Aber ich weiß nicht, wie viel Zeit du hast. :) –
Also im Wesentlichen ein anderes Repository, zwischen diesem und dem DbContext, das alles auf Unternehmensebene filtert? Ihre Idee, sie mithilfe von Datenbankansichten zu filtern, ist wahrscheinlich die beste Option, aber momentan habe ich keine Zeit dafür. Wie auch immer, vielen Dank für Ihre Hilfe Robert. :) –