1

C#으로 멀티 레이어 응용 프로그램 (서비스)을 작성하려고합니다. 정확히 말하면, Owin과 함께 자체적으로 호스팅되는 ASP.NET Web API를 사용하여 REST 웹 서비스를 구축하려고합니다. 이제는 다음과 같은 구성 요소가 있습니다 (각 구성 요소는 .dll에 있습니다).

- RestHost (여기서는 콘솔 응용 프로그램입니다)
- RestService (여기 내 웹 서비스 마녀입니다 모든 컨트롤러)
- InterfacesLayer
- ModelLayer (여기 단지) 자신의 get/set 메소드로, 내가 사용하는 객체
- ModelLayer의 내부 데이터 영역 (모든 단일 클래스는 데이터 영역에서 자신의 클래스가 플러스가 데이터베이스 연결 클래스)
- BusinessLayer (여기서는 모든 논리가 완료되며 모델의 모든 클래스가 자체 클래스를 가지며이 계층은 REST 서비스 및 데이터와 통신합니다 아르 자형).

IOC (종속성 주입)를 사용하는 C#의 데이터 액세스 레이어

RestHost - 이름에서 알 수 있듯이 내 서비스의 호스트입니다. 게다가 여기에 내 의존성 주입도하고있다. 그렇지 않은 많은 코드이기 때문에 나는 그것을 게시 할 예정입니다 :

static void Main(string[] args) 
    { 

     IUnityContainer container = new UnityContainer(); 
     // Dependency Resolving 
     container.RegisterType<IAktData, AktDataImpl>(new HierarchicalLifetimeManager()); 
     container.RegisterType<IAktService, AktServiceImpl>(new HierarchicalLifetimeManager()); 

     container.RegisterType<ILeistungData, LeistungDataImpl>(new HierarchicalLifetimeManager()); 
     container.RegisterType<ILeistungService, LeistungServiceImpl>(new HierarchicalLifetimeManager()); 

     container.RegisterType<IPersonData, PersonDataImpl>(new HierarchicalLifetimeManager()); 
     container.RegisterType<IPersonService, PersonServiceImpl>(new HierarchicalLifetimeManager()); 

     container.RegisterType<IPersistent, FirebirdDB>(new HierarchicalLifetimeManager()); 


     string serverAddress = ConfigurationManager.AppSettings["serverAddress"]; 
     string connectionString = ConfigurationManager.ConnectionStrings["connectionStrings"].ConnectionString; 

     using (RESTService.StartServer(container, serverAddress,connectionString)) 
     { 

      Console.WriteLine("Server started @ "+ DateTime.Now.ToString() + " on " + serverAddress + "/api"); 
      Console.ReadLine(); 
     } 
    } 

아, 그리고 내가 얘기를 깜빡 했네요,하지만 당신은 나 또한 어디에 내 연결부의 app.config를 읽고있다 나의 호스트 응용 프로그램 코드에서 볼 수있는 문자열이 호스팅됩니다.
여기 내 문제가 있습니다. 내 서비스에서 데이터베이스 연결에 액세스하는 방법을 모르겠습니다. 여기 파이어 버드를 데이터 액세스 레이어에 구현하고 있지만, 애플리케이션에서 어떻게 사용하는지 확신 할 수 없습니다. 물론 가장 쉬운 방법은 인스턴스를 만들어 내 서비스에 전달하는 것이지만 이것이 내가하고 싶은 마지막 일입니다. 나는 또한 파이어 버드를 정적 클래스 또는 싱글 톤으로 구현하는 것을 생각해 왔지만, 그렇다면 내 IPersistant 인터페이스를 사용할 수 없다. (게다가 이것은 올바른 접근이라고 생각하지 않는다.)
제 질문은이 종류의 물건에 대한 모범 사례가 있습니까? 필자는 어떻게 든 IPSistent (Firebird) 구현에 connectionstring을 전달할 필요가 있지만 실제로 RESTService에 Firebird 인스턴스를 만들지 않아도됩니다.

감사

당신이 구축하고있는 것과 같은 다층 응용 프로그램의 일반적인 패턴은 일반적으로 데이터베이스에 접속하여 서비스를 제공하는 데이터 계층 또는 데이터를 지속의 다른 방법을 가지고있다

답변

0

저장소를 통해.

그런 다음 IoC 컨테이너를 구성하여 연결 문자열을 저장소에 삽입 한 다음 저장소를 서비스에 삽입 할 수 있습니다. 이렇게하면 서비스가 데이터가 지속되는 방식에 대해 불가지론 적으로 머무르며 비즈니스 논리를 정의하는 데 집중할 수 있습니다.

사실 데이터베이스에서 데이터를 유지하는 대신 Azure의 CDN에있는 blob에 저장하는 것과 비슷한 일을합니다. 내 IOC의 (내 경우에는 StructureMap를) withing에 구성은 다음과 같습니다

string storageApiKey = ConfigurationManager.AppSettings["CloudStorageApiKey"]; 
string storageUsername = ConfigurationManager.AppSettings["CloudStorageUsername"]; 
this.For<IImageStorageRepository>().Use<ImageStorageRepository>().Ctor<string>("storageApiKey").Is(storageApiKey).Ctor<string>("storageUsername").Is(storageUsername); 

를 내 저장소는 다음과 같이보고와 함께 :

public class ImageStorageRepository : IImageStorageRepository 
{ 
    .... 
    public ImageStorageRepository(string storageApiKey, string storageUsername) 
    { 
     this.cloudIdentity = new CloudIdentity() { APIKey = storageApiKey, Username = storageUsername }; 
     this.cloudFilesProvider = new CloudFilesProvider(cloudIdentity); 
    } 
    .... 
} 
+0

을 나는 그것이 매우 간단했을 결국. 난 내 APP 구성 파일 (내 서비스 호스팅 응용 프로그램의) 내 DB 구성을 작성하고 내 datalayer에서 연결 문자열을 읽을 때마다 (연결이 필요할 때마다). 어쩌면 내가 어딘가에 저장할 수도 있기 때문에 매번 읽을 필요가 없지만 지금은 나에게 좋습니다. 답변 주셔서 감사합니다 – dev01

+0

다행스럽게 도와 줬어.당신이 그 대답에 만족한다면 그 답을 정확하게 표시하는 것을 잊지 마십시오! –