Класс обслуживания + Создание новых классов - PullRequest
0 голосов
/ 07 ноября 2011

Я хотел бы знать, является ли это потокобезопасным / хорошей практикой.Мой IOC недействителен, все вызовы уровня обслуживания выполняются через настройку по умолчанию (в переходной области я думаю?).

Вопрос , является ли создание экземпляра new FileAllocation(loggedonuser,_repo) правильным?Лучший способ?Каков наилучший способ сделать это?Это класс домена, который содержит логику, которую можно вызывать из различных сервисов, обычно используется несколько вызовов базы данных, большую часть времени не требуется постоянство ...

В любом случае, я вызываю свой сервисный метод черезнапример, интерфейс

void SaveFile(int reportid, stream file); //Interface name: IReportFileService


public Class FileService: Servicebase, IReportFileService
{

  private readonly IRepoSession _repo;
  public FileService(IUserSession user, IRepoSession repo, IUpdateSession update)
 : base(user,update)
 {
   _repo = repo;
 }

 //save file if users 'counter' is ok..
 public void SaveFile(int reportid, stream file)
 {

  //here I want to instantiate a new class that I store in my domain and store the counters
  //etc and do related db calls to check up relevant values

  //note loggedonuser is a prop on my *base class*
  var userChecks = new FileAllocation(loggedonuser,_repo);
  userChecks.CountEmUp(); //exception is thrown if 0, less than "limit" etc...

  base.update(userChecks.mycompany); //persist
  base.commit(); //base class method includes try, catch block...

 }

}

public class FileAllocation
{

 private readonly IRepoSession _repo;
 private readonly Loggedonuser _user;
 private int CompanyUploads;
 private int UserUploads;
 public Company mycompany;

 public FileAllocation(Loggedonuser user, IRepoSession repo)
 {
  _repo = repo;
  _user = user;
 }

 public void CountEmUp()
 {
   //do error checking,
   //load up other tables can user upload - permissions, count is ok etc...
   // check the upload type if of certain type we cannot proceed - call another method on this class

   //set myCompany variable to new limits etc...

 }

}

Базовая служба включает в себя реквизит, я не хочу создавать экземпляр этого из других сервисов т.е. более одного раза, как мне этого избежать?

    private LoggedonuserDTO _currentuser = null;
    protected LoggedonuserDTO loggedonuser
    {
        get
        {
            if (_currentuser == null)
            {

                _currentuser = _user.GetCurrentUser(); //make db call here...
            }
            return _currentuser;
        }
    }

@ Darin предложил:

public interface IFileAllocation
{
  CountEmUp(Loggedonuser currentuser);
}


//pass in loggedonuser to any method that requires it...
public class FileAllocation: IFileAllocation
{
  CountEmUp(Loggedonuser currentuser)
  { 
   //do whatever here...

  }
}

1 Ответ

1 голос
/ 07 ноября 2011
var userChecks = new FileAllocation(loggedonuser,_repo);

вводит сильную связь между классами FileService и FileAllocation.Если это не проблема для вас, вы можете оставить это так.В противном случае вы можете абстрагировать операции этого FileAllocation класса в интерфейс и затем внедрить его в FileService.Таким образом, FileService слабо связан с FileAllocation и может быть повторно использован в различных контекстах и ​​изолированно протестирован.

...