正如详细InstancePerApiControllerType不工作 ,我无法使用InstancePerApiControllerType
来配置我的解决方案。 答案只要有工作,只要我直接注入ConnectionContext
到控制器,或以其他方式知道,一个类只能使用特定的控制器。 不幸的是,是不是在我的情况的情况下:
ControllerA -> EngineA -> RepositoryA -> GenericEntityAccessor
ControllerB -> EngineB -> RepositoryB -> GenericEntityAccessor
问题是,当我们通过进来ControllerA
, GenericEntityAccessor
需要“字符串A”和ControllerB
需要“字符串B”。
当然,真实的情况是有点复杂,它有一些不好的做法,如代码,直接“新闻” -最多一个ConnectionContext
(它的遗留代码)。 我目前正在探索提供提供使用懒惰通过Autofac注入和配置控制器的连接字符串的另一个组成部分,但糟糕的做法,也有导致问题(即一旦我开始改变事物的接口,所有的多米诺骨牌开始翻倒,我结束了15个班后来知道我是如何到达那里)。
是否有解决这种类型的事情的任何模式,技术等? 我无法想象这一切都让少见。
更新:
为了提供一些更多的细节,因为我有一些麻烦这个工作,一般我们我申请以下层次结构,显示的作用域
Controller -> InstancePerApiRequest()
I*Repository -> ?
I*Manager -> ?
I*Builder -> ?
I*Adapter -> ?
ISqlServerConnectionContext -> ?
IConnectionContextCache -> InstancePerApiRequest()
我有许多组件是直接拿ISqlServerConntectionContext,我试图提供像这样:
container.Register(c =>
{
var connectionContextCache = c.Resolve<IConnectionContextCache>();
var connection = (ISqlServerConnectionContext)connectionContextCache.CurrentConnectionContext;
return connection;
}).As<ISqlServerConnectionContext>().InstancePerDependency();
不幸的是,在这一点上我得到了CurrectConnectionContext空。 我在这一点上的猜测是我有没有被从控制器植根一些成分,我目前正在经历的依赖手工试图找到它(据我所知的是不是为我找出触发该对象的方式Autofac试图提供ISqlServerConnectionContext当我调试)。
更新2:
事实证明,我确实有一些问题,我在那里注册不当的东西,创造的依赖关系ISqlServerConnectionContext
为DocumentController
,即使它没有一个(这是通过委托创造的东西,它并依赖于)。
现在我有一个循环引用,我敢肯定,我已经创建了自己的注册:
container.Register(x =>
{
if (x.IsRegistered<HttpRequestMessage>())
{
var httpRequestMethod = x.Resolve<HttpRequestMessage>();
var tokenHelper = x.Resolve<ITokenHelper>();
var token = tokenHelper.GetToken(httpRequestMethod);
return token ?? new NullMinimalSecurityToken();
}
return new NullMinimalSecurityToken();
}).As<IMinimalSecurityToken>().InstancePerApiRequest();
container.Register(c =>
{
var connectionContextCache = c.Resolve<IConnectionContextCache>();
var token = c.Resolve<IMinimalSecurityToken>();
var connection = (ISqlServerConnectionContext)connectionContextCache.CurrentConnectionContext;
connection.Token = token;
return connection;
}).As<ISqlServerConnectionContext>().InstancePerApiRequest();
问题是ISqlServerConnectionContext
有一个类型的属性IMinimalSecurityToken
是可选的,而当绝对不使用ISqlServerConnectionContext
被用于查找IMinimalSecurityToken
,这取决于ISqlServerConnectionContext
通过ITokenHelper
。
更新3:
为了完整起见,为了解决我的循环引用的问题,我需要使用命名服务,并使用SqlServerConnectionContext
这并没有IMinimalSecurityToken
属性集IOAuthTokenManager
登记。 现在我越来越可怕
不带标签的匹配范围“AutofacWebRequest”可见
错误,但我认为值得一个新的问题,如果我不能够解决这个问题。
container.Register(c =>
{
var productId = WellKnownIdentifierFactory.Instance.GetWellKnownProductIdentifier(WellKnownProductIdentifiers.RESTSearchService);
var connectionString = ConfigurationManager.AppSettings[AppSettingsNames.DatabaseConnection];
var newConnectionContext = new SqlServerConnectionContext(connectionString) { ProductID = productId };
newConnectionContext.Open();
return newConnectionContext;
}).Named<ISqlServerConnectionContext>("OAuthTokenConnectionContext").InstancePerApiRequest();
container.Register(c => new SqlServerBuilderFactory(c.ResolveNamed<ISqlServerConnectionContext>("OAuthTokenConnectionContext"))).Named<IBuilderFactory>("OAuthTokenBuilderFactory").InstancePerApiRequest();
container.Register(c =>new OAuthTokenManager(c.ResolveNamed<IBuilderFactory>("OAuthTokenBuilderFactory"))).As<IOAuthTokenManager>().InstancePerApiRequest();