使用依赖注入连接到数据库

时间:2017-12-04 14:13:14

标签: c# model-view-controller dependency-injection database-connection simple-injector

我正在尝试学习如何使用依赖注入,但是在我的数据库方面遇到了一些麻烦。到目前为止,这是我的过程:

我有一个MVC项目,其中控制器使用我的类库中的不同存储库。 所有存储库都使用相同的数据库。

首先,我使用SimpleInjector注册Repositories Application_start方法:

var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
var client = new GraphClient(uri, username, password);
container.Register<IRepoA>(() => new RepoA(client);
container.Register<IRepoB>(() => new RepoB(client);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

在每种方法中,我都是这样的:

  client.Connect();
  client.performSomeQuery();
  client.Dispose();

这有效,但这意味着每次调用方法时我都会重新连接到数据库。 为避免这种情况,请将connect-call移至此处:

var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
var client = new GraphClient(uri, username, password);
client.Connect();
container.Register<IRepoA>(() => new RepoA(client);
container.Register<IRepoB>(() => new RepoB(client);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();

但是我从来没有把我的联系处理掉。

我现在想要注册我的databaseclient;

container.RegisterSingleton(() =>
{
    var client = new GraphClient(uri, username, password);
    client.Connect();
    return client;
});

然后像这样注入:

container.Register<IRepoA>(() => new RepoA(container.GetInstance<GraphClient>()));

这是正确的方法吗?

是否正确理解连接将在容器生命周期结束时处理?

我确实得到了一个&#34;隐式捕获的闭包:容器&#34;当我注册客户时。

1 个答案:

答案 0 :(得分:1)

有多种方法可以做事......所以要求正确的方法可能会让你走上错误的道路......

但这是我在你的案子中所做的......

我会介绍一种称为工作单元的模式......将其视为商业交易

您打开一个工作单元,并在其生命周期内执行各种数据库交互,可能都在一个数据库事务中。所有这些交互可能分布在不同的存储库中。如果您的整批交互完成没有需要回滚的错误,则声明工作单元已完成并保留其范围(范围与使用(...)范围中一样)

如果有错误,你没有在它的生命周期结束前声明它完成......

在您工作单元的生命周期结束时,您可以提交或回滚所有欠载的数据库事务(通常只有一个),具体取决于是否声明完成的事实

此工作单元对象通常还包含我的数据库连接对象并提供与存储库的连接

再次使用依赖注入,您可以使用工厂方法,根据存储库在实例化期间请求的接口提供不同的数据库连接...

通常第一个需要连接的repo会导致工厂创建一个并打开它(可选择根据使用的repos可以有不同的连接),而第二个请求连接的repo获取已创建的连接在...之前打开...

工作单元的末尾(参见IDisposable)也表示connectionfactory的结束... connectionfactory的结尾意味着打开连接和repos的结束...因为后者被实例化了一个使用块,并且根据使用的资源,他们永远不应该离开所说的块