Повторное использование кода, приводящее к исключению StackOverFlow - PullRequest
0 голосов
/ 26 сентября 2018

Я использую MVC5 с Entity Framework, и у моего приложения есть 2 уровня (проекты): уровень данных (DL) и объединенный уровень бизнес / презентации (BPL).Операции CRUD определены в DL и доступны через BPL через интерфейс.Классы в BPL зависят друг от друга, а также от DL.Я попытался показать сценарий на рисунке ниже: enter image description here

На рисунке выше показано, что 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 ();

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