我正在根据related question的答案探索Castle Windsor的安装程序功能。我想使用Web.config来指定数据库的名称,而我不想在代码中显式设置数据库的名称。我尝试了KrzysztofKoźmic的示例,当我启动该项目时,我在container.Register
处的断点被击中,但是依旧无法解决:
public class RepositoriesInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Where(Component.IsInSameNamespaceAs<SqlUsersRepository>())
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Transient
.DependsOn(new { databaseName = "MyDatabaseName" })));
}
}
桑德斯(Sanders)建议我们可以使用Web.config来解决依赖关系(请注意,他这样做是为了获取连接字符串,但是我的连接字符串是加密的,因此我的操作方式略有不同):
<castle>
<components>
<component id="SqlUsersRepository"
service="MyDevArmyModel.Entities.IUsersRepository, MyDevArmyModel"
type="MyDevArmyModel.Entities.SqlUsersRepository, MyDevArmyModel">
<parameters>
<databaseName>MyDatabaseName</databaseName>
</parameters>
</component>
</components>
</castle>
我的
SqlUsersRepository
和IUsersRepository
在同一个命名空间中,但是它们是类库的一部分,该类库在当前项目中被引用。 SqlUsersRepository
从Web查找连接字符串。配置数据库名称:public interface IUsersRepository
{
IQueryable<User> Users { get; }
// ...
// and some other things
// ...
}
public class SqlUsersRepository : IUsersRepository
{
private DataContext dataContext;
private Table<User> usersTable;
public IQueryable<User> Users { get { return usersTable; } }
public SqlUsersRepository(string databaseName)
{
HttpRequestWrapper request = new HttpRequestWrapper(System.Web.HttpContext.Current.Request);
Configuration config = WebConfigurationManager.OpenWebConfiguration(request.ApplicationPath);
dataContext = new DataContext(config.GetConnetionString(databaseName));
usersTable = dataContext.GetTable<User>();
}
// .... the rest of the repository goes here
}
有什么帮助吗?
附言
即使我使用硬编码的数据库名称(如在
RepositoriesInstaller
中所示),我仍然遇到异常:“ /”应用程序中的服务器错误。不能
创建组件
'MyProjectName.Controllers.UserController'
因为它有依赖关系
满意。
MyProjectName.Controllers.UserController
正在等待以下内容
依赖项:
服务:
-MyProjectName.Entities.IUsersRepository
尚未注册。描述:
在处理期间发生未处理的异常
当前网站的执行
请求。请检查堆栈跟踪
有关该错误的更多信息
以及它在代码中的起源。
异常详细信息:
Castle.MicroKernel.Handlers.HandlerException:
无法创建组件
'MyProjectName.Controllers.UserController'
因为它有依赖关系
满意。
MyProjectName.Controllers.UserController
正在等待以下内容
依赖项:
服务:
-MyProjectName.Entities.IUsersRepository
尚未注册。
更新资料
我已经发布了一个解决异常问题的答案,但是我还没有弄清楚如何使用Web.config来存储Castle Windsor的特定部分。
最佳答案
您应该可以通过将XML简化为以下内容来实现此目的:
<castle>
<components>
<component id="SqlUsersRepository">
<parameters>
<databaseName>MyDatabaseName</databaseName>
</parameters>
</component>
</components>
</castle>
然后确保您的注册在正确的密钥/ ID下注册了存储库-例如像这样:
container.Register(AllTypes(...).Configure(c => c.Named(c.Implementation.Name)))
其中所有键都将设置为每种具体类型的简称。
请注意,这种命名方案可能不适合您,因此您可能应使
c.Named(...)
适应您认为适合的用例。只需确保存储库的注册密钥与XML中的id
属性相匹配即可。