Я использую MVC5 с Entity Framework, и у моего приложения есть 2 уровня (проекты): уровень данных (DL) и объединенный уровень бизнес / презентации (BPL).Операции CRUD определены в DL и доступны через BPL через интерфейс.Классы в BPL зависят друг от друга, а также от DL.Я попытался показать сценарий на рисунке ниже:
На рисунке выше показано, что CustomerItemViewModelConntroller зависит как от операций ICRUDOperations, так и от CustomerBusinessLogic.При выполнении метода create он сначала читает CRUDOperations при создании экземпляра CustomerItemBusinessLogic, а затем снова, когда инициируется CustomerItemBusinessLogic.Это два чтения перед завершением одного процесса.
У меня есть исключение StackOverFlow, которое, как я подозреваю, связано с этим множественным доступом.Я стою, чтобы быть исправленным.Есть ли способ обойти это много чтений?Может ли это быть причиной исключения StackOverFlow?
Вот фрагмент исключения:
System.StackOverflowException был необработан HResult = -2147023895 Сообщение = Исключение типа 'Система.StackOverflowException 'было брошено.InnerException:
Фрагмент кода, в котором возникает исключение:
public sealed class GetCRUDAction
{
public ICRUDCollections<Customer> getCustomerCRUD()
{
return new CustomerCRUD();
}
}
CustomerCRUD выполняет обычные операции чтения, обновления и удаления базы данных.В качестве примера ниже приведен метод создания CustomerCRUD
public Customer Create(Customer cust)
{
using (var db = new DbConxn())
{
db.Customers.Add(cust);
db.SaveChanges();
return cust;
}
}
Код моего контроллера выглядит следующим образом:
private ICRUDCollections<Customer> _cust = new GetCRUDAction().getCustomerCRUD();
private CustomerItemBusinessLogic _bl = new CustomerItemBusinessLogic();
// GET: CustomerItemViewModel/Index
public ActionResult Index()
{
return View(_cust.Read());
}
// Post: CustomerItemViewModel/Create
public ActionResult Create(FormCollection collection)
{
Customer cust = _bl.setCustomerItems(collection);
Item item = _bl.setItemDetails;
return RedirectToAction("Index");
}
Наконец, CustomerItemBusinessLogic выглядит так:
private ICRUDCollections<Customer> _cust = new GetCRUDAction().getCustomerCRUD();
public Customer setCustomerItems(FormCollection collection)
{
Customer cust = new Customer();
string c_name = collection["cust_Name"];
return cust;
}
Повторениенаходится в классе Controller и BusinessLogic:
private ICRUDCollections _cust = new GetCRUDAction (). getCustomerCRUD ();