Asp.net mvc 具有IOC(依赖注入)的c#中的数据访问层

Asp.net mvc 具有IOC(依赖注入)的c#中的数据访问层,asp.net-mvc,interface,database-connection,inversion-of-control,data-layer,Asp.net Mvc,Interface,Database Connection,Inversion Of Control,Data Layer,我正在尝试用C#构建一个多层应用程序(服务)。确切地说,我正在尝试使用ASP.NET Web Api构建REST Web服务,该服务将由我自己托管(使用Owin)。现在我已经有了以下组件(每个组件都在一个单独的.dll中): -RestHost(在我的例子中是一个控制台应用程序) -RestService(这是我的web服务,它包含所有控制器) -界面层 -ModelLayer(以下是我使用的对象,仅包括它们的get/set方法) -数据层(ModelLayer中的每个类在数据层中都有自己的类,

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

-RestHost(在我的例子中是一个控制台应用程序)
-RestService(这是我的web服务,它包含所有控制器)
-界面层
-ModelLayer(以下是我使用的对象,仅包括它们的get/set方法)
-数据层(ModelLayer中的每个类在数据层中都有自己的类,另外还有数据库连接类)
-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();
        }
    }
static void Main(字符串[]args)
{
IUnityContainer容器=新的UnityContainer();
//依赖项解析
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
字符串serverAddress=ConfigurationManager.AppSettings[“serverAddress”];
string connectionString=ConfigurationManager.connectionString[“connectionString”]。connectionString;
使用(RESTService.StartServer(容器、服务器地址、连接字符串))
{
Console.WriteLine(“服务器已启动@”+DateTime.Now.ToString()+”在“+serverAddress+”/api上”);
Console.ReadLine();
}
}
哦,还有我忘记提到的,但是你可以从代码中看到,在我的主机应用程序中,我也在阅读App.Config,其中承载了我的连接字符串
这是我的问题。我不确定如何从我的服务访问数据库连接。在这里,我在我的数据访问层中实现Firebird,但我不确定如何在我的应用程序中使用它。当然,最简单的方法就是创建一个实例并将其传递给我的服务,但这是我最不想做的事情。我也一直在考虑将Firebird实现为静态类或单例,但是我不能使用我的IPersistant接口(除此之外,我认为这不是正确的方法)。
所以我的问题是,对于这类东西有什么最佳实践吗?我需要以某种方式将connectionstring传递给IPersistent(Firebird)的实现,但实际上不需要在RESTService中创建Firebird的实例


感谢

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

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

实际上,我对一个存储库做了类似的事情,它不是在数据库中持久化数据,而是将数据存储在Azure的CDN上的blob中。我的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);
    }
    ....
}

最后我做的很简单。我只需在APP.config文件(我的服务托管应用程序)中写入DB配置,然后读取数据层中的连接字符串(每次我需要连接时)。也许我也可以把它存放在某个地方,这样我就不需要每次都读它了,但现在这对我来说没问题。谢谢你的回答,很高兴有帮助。如果你对答案感到满意,那么别忘了将答案标记为正确!