1

Я пытаюсь создать многослойное приложение (услугу) на C#. Если быть точным, я пытаюсь создать веб-сервис REST с помощью ASP.NET Web Api, который будет размещаться самостоятельно (с Owin). Теперь я дошел до того, что у меня есть следующие компоненты (каждый из них находится в отдельной .dll):

- RestHost (который в моем случае является консольным приложением)
- RestService (здесь моя веб-служба witch все контроллеры)
- InterfacesLayer
- ModelLayer (здесь являются объектами, которые я использую, только с их методами получения/установки)
- DataLayer (каждый класс внутри ModelLayer имеет свой собственный класс в Datalayer, плюс есть Класс соединения с базой данных)
- BusinessLayer (здесь вся логика завершена, опять же, каждый класс из модели имеет свой собственный класс, и этот уровень общается с службой REST и datalaye р).

Уровень доступа к данным в C# с IOC (инъекция зависимостей)

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 где моя связь строка размещена.
И вот моя проблема. Я не уверен, как получить доступ к соединению базы данных с моей службы. Здесь я реализую Firebird на моем уровне доступа к данным, но я не уверен, как использовать его в своем приложении. Конечно, самым простым способом было бы просто создать экземпляр и передать его моей службе, но это последнее, что я хочу сделать. Я также думал о внедрении Firebird как статическом классе или как одинарный, но тогда я не могу использовать свой интерфейс IPersistant (и кроме того, я не думаю, что это правильный подход).
Так что мой вопрос будет, есть ли какая-нибудь передовая практика для такого рода вещей? Мне почему-то нужно передать строку соединения для реализации IPersistent (Firebird), но без фактического создания экземпляра Firebird в моем RESTService.

Благодаря

ответ

0

Общая схема для применения многослойной, как тот, который вы строите, чтобы иметь слой данных, который предоставляет свои услуги с доступом к базе данных, или какой-либо другой метод сохраняющихся данных, как правило, через репозиторий.

Затем вы можете сконфигурировать свой контейнер IoC, чтобы ввести строку подключения в свой репозиторий, а затем вставить свой репозиторий в свою службу. Таким образом, ваша служба остается агностикой относительно того, как данные сохраняются и могут сосредоточиться на определении бизнес-логики.

Я фактически делаю подобную вещь для репозитория, вместо того, чтобы сохранять данные в базе данных, сохраняет их в блоке на CDN Azure. Конфигурация жгутов мой IoC (StructureMap в моем случае) выглядит следующим образом:

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.config (моего приложения для хостинга), а затем читаю строку подключения в своем datalayer (каждый раз, когда мне нужно подключение). Может быть, я мог бы также хранить его где-нибудь, поэтому мне не нужно его читать каждый раз, но пока это нормально для меня. Спасибо за ответ – dev01

+0

Рад, что это помогло.Если вы довольны ответом, не забудьте отметить ответ правильно! –