如何使用统一管理 mongorepository 单例
How to manage mongorepository singleton using unity
我想使用 unity 来管理我的 mongo 存储库,但是当我尝试使用 Web.config
和 LoadConfiguration()
注册它时,我收到无法破译的错误:
An exception of type 'System.ArgumentException' occurred in
Microsoft.Practices.Unity.Configuration.dll but was not handled in
user code
Additional information: The container named "" is not defined in this
configuration section.
这是我的Global.asax
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
namespace OOP_project
{
public class MvcApplication : System.Web.HttpApplication
{
internal static readonly IUnityContainer unity = new UnityContainer();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
unity.LoadConfiguration();
}
}
}
这是我 Web.config
的相关部分
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="string" type="System.String, mscorlib" />
</typeAliases>
<containers>
<container name="container">
<types>
<type type="MongoRepository.MongoRepository`1, MongoRepository" mapTo="MongoRepository.MongoRepository`1, MongoRepository">
<lifetime type="Singleton" />
<constructor>
<param name="connectionString" parameterType="string" value="mongodb://127.0.0.1/Blog"></param>
</constructor>
</type>
</types>
</container>
</containers>
</unity>
我想了解这个错误的实际含义以及如何修复它。
我发现您的代码有两个问题:
首先调用LoadConfiguration
时需要指定容器名称。在配置文件中,容器名称是 "container"(在 <container>
xml 元素中),因此您需要这样指定:
unity.LoadConfiguration("container");
或者,将配置文件中的容器名称更改为空字符串,如下所示:
<container name="">
与你的问题没有直接关系的第二个问题是单例生存期应该用这样的小写字母指定:
<lifetime type="singleton" />
对了,为什么要用配置文件来配置Unity?使用配置文件配置 Unity 很脆弱。例如,如果您在代码中更改了一个 class 名称,它不会在配置文件中更改。您必须手动更改它,否则您的应用程序将中断。
除非您需要能够在不重新编译的情况下更改依赖项,否则您应该更喜欢通过代码配置容器。
请注意,您可以通过代码进行一些注册,一些在配置文件中进行注册(对于您需要能够在不重新编译的情况下更改的依赖项)。您可以轻松地在网上找到有关如何执行此操作的资源。
我想使用 unity 来管理我的 mongo 存储库,但是当我尝试使用 Web.config
和 LoadConfiguration()
注册它时,我收到无法破译的错误:
An exception of type 'System.ArgumentException' occurred in Microsoft.Practices.Unity.Configuration.dll but was not handled in user code
Additional information: The container named "" is not defined in this configuration section.
这是我的Global.asax
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
namespace OOP_project
{
public class MvcApplication : System.Web.HttpApplication
{
internal static readonly IUnityContainer unity = new UnityContainer();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
unity.LoadConfiguration();
}
}
}
这是我 Web.config
的相关部分<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="string" type="System.String, mscorlib" />
</typeAliases>
<containers>
<container name="container">
<types>
<type type="MongoRepository.MongoRepository`1, MongoRepository" mapTo="MongoRepository.MongoRepository`1, MongoRepository">
<lifetime type="Singleton" />
<constructor>
<param name="connectionString" parameterType="string" value="mongodb://127.0.0.1/Blog"></param>
</constructor>
</type>
</types>
</container>
</containers>
</unity>
我想了解这个错误的实际含义以及如何修复它。
我发现您的代码有两个问题:
首先调用LoadConfiguration
时需要指定容器名称。在配置文件中,容器名称是 "container"(在 <container>
xml 元素中),因此您需要这样指定:
unity.LoadConfiguration("container");
或者,将配置文件中的容器名称更改为空字符串,如下所示:
<container name="">
与你的问题没有直接关系的第二个问题是单例生存期应该用这样的小写字母指定:
<lifetime type="singleton" />
对了,为什么要用配置文件来配置Unity?使用配置文件配置 Unity 很脆弱。例如,如果您在代码中更改了一个 class 名称,它不会在配置文件中更改。您必须手动更改它,否则您的应用程序将中断。
除非您需要能够在不重新编译的情况下更改依赖项,否则您应该更喜欢通过代码配置容器。
请注意,您可以通过代码进行一些注册,一些在配置文件中进行注册(对于您需要能够在不重新编译的情况下更改的依赖项)。您可以轻松地在网上找到有关如何执行此操作的资源。