Добрый день!Какой вариант использования UnitOfWork в обслуживании является более правильным?
Моя система имеет архитектуру N-слой:
- DAL (Доступ к данным Layer) (Entity Framework 6, Хранилища, UnitOfWork)
- BLL (Busisness логика Layer)
- PL (Presentation слой) (ASP.NET MVC 4)
вопрос заключается в следующем:
Какой вариант использования UnitOfWork более подходит?
Первый вариант (использование характерных, в явно вызывать Dispose() в контроллере ASP.NET MVC):
namespace MyApp.BLL.Services
{
public class MyService
{
private UnitOfWork _uow { get; set; }
public MyService()
{
_uow = new UnitOfWork();
}
public List<SomeDTO> SomeGetMethod()
{
IEnumerable<Entity> entities = _uow.SomeRepository.Get(x => x.Id==1);
...
return ...
}
public void SomeSetMethod(int value)
{
_uow.SomeRepository.Insert(new Entity { Value = value });
_uow.Commit(); // SaveChanges();
}
public Dispose()
{
_uow.Dispose();
}
}
}
Второй вариант (с использованием блока):
namespace MyApp.BLL.Services
{
public class MyService
{
public List<SomeDTO> SomeGetMethod()
{
using(UnitOfWork uow = new UnitOfWork())
{
IEnumerable<Entity> entities = uow.SomeRepository.Get(x => x.Id==1);
}
....
return ...
}
public void SomeSetMethod(int value)
{
using(UnitOfWork uow = new UnitOfWork())
{
uow.SomeRepository.Insert(new Entity { Value = value });
uow.Commit(); // SaveChanges();
}
}
}
}
И второй вопрос:
Например, у нас есть служба, которая отвечает за работу модуля сообщений в системе - IMessagesService, и у нас также есть вторая услуга, которая является ответчиком для некоторого модуля - ISomeService. В результате создания метода в службе ISomeService необходимо отправить сообщение в систему. Будет ли правильным вызывать метод другого IMessagesService для отправки сообщения?
Пример:
public interface IMessagesService
{
void Send(int userFrom, int userTo, string message);
// other methods...
}
public class MessageService
{
public void Send(int userFrom, int userTo, string message)
{
// some logic here
}
}
public interface ISomeService
{
void SomeMethod(int somevalue);
}
public class SomeService: ISomeService
{
public void SomeMethod(int somevalue)
{
// some logic here
// после необходимо отправить сообщение
messageService = new MessageService();
messageService.Send(1, 2, "some text");
}
}
В другом слова- это правильно звонить из одного метода службы второй службы?
Заранее благодарен!
Почему вы 'новый()' 'вверх UnitOfWork' и' SomeService'? Если мы говорим о DI, то вы вводите их интерфейсы в конструктор 'BaseService'. – kayess
@ OJay Спасибо! Вы сказали: _I фактически накладываю еще один слой между PL и BLL, чтобы контролировать область действия, а Dependancy вводит сервисы, вроде unitofworkcontroller, если вы будете. Можете ли вы показать мне пример этого слоя, пожалуйста? И 'PL' не должен ссылаться на' DAL' (UnitOfWork здесь), не так ли? – WhiteNinja