1

我正在尝试用 C# 构建一个多层应用程序(服务)。准确地说,我正在尝试使用 ASP.NET Web Api 构建一个 REST Web 服务,它将由我自己(使用 Owin)托管。现在我已经有了以下组件(每个组件都在一个单独的 .dll 中):

- RestHost(在我的例子中是一个控制台应用程序)
- RestService(这是我的所有控制器的 Web 服务)
- InterfacesLayer
- ModelLayer(这里是我使用的对象,只是使用它们的 get/set 方法)
- DataLayer(ModelLayer 中的每个类在 Datalayer 中都有自己的类,另外还有数据库连接类)
- BusinessLayer(这里所有的逻辑都完成了,模型中的每个类都有自己的类,并且该层与 REST 服务和数据层通信)。

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) 的实现,但实际上没有在我的 RESTService 中创建 Firebird 的实例。

谢谢

4

1 回答 1

0

多层应用程序(如您正在构建的应用程序)的一般模式是拥有一个数据层,为您的服务提供对数据库的访问,或其他一些持久化数据的方法,通常通过存储库。

然后,您可以配置您的 IoC 容器以将您的连接字符串注入您的存储库,然后将您的存储库注入您的服务。这样,您的服务就不会知道数据是如何持久化的,并且可以专注于定义业务逻辑。

实际上,我对存储库做了类似的事情,它不是将数据保存在数据库中,而是将其存储在 Azure CDN 上的 blob 中。我的 IoC(在我的例子中是结构图)的配置如下所示:

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);
    }
    ....
}
于 2014-10-03T20:28:53.727 回答