任何人都有幸将StructureMap(DI Framework)与WCF集成在一起?
我可以像这样在我的WCF服务的构造函数中返回默认实例,但显然它并不理想.
public MemberService()
{
this.memberRepository = StructureMap.ObjectFactory.GetInstance<IMemberRepository>();
}
Run Code Online (Sandbox Code Playgroud)
我见过这个(http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/29/integrating-structuremap-with-wcf.aspx)但由于我认为它与最新的2.5+不兼容,所以没有运气设置发布StructureMap.
如何在扫描程序集时添加一些作用域?谷歌似乎对"结构图扫描缓存"感到满意:/ /
ObjectFactory.Configure(registry =>
{
registry.Scan(x =>
{
x.AssemblyContainingType(typeof(IRepository<>));
x.With<DefaultConventionScanner>();
});
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个服务接口:
public interface IFooService
{
void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
并且该服务的具体实现是通用的:
public class FooService<TRequestingClass> : IFooService
{
public virtual void DoSomething() { }
}
Run Code Online (Sandbox Code Playgroud)
我还有一些需要IFooService实例的其他类:
public class Bar
{
private IFooService _fooService;
public Bar(IFooService fooService)
{
this._fooService = fooService;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要连接我的IoC容器,这样当创建Bar时,它会传递一个FooService <Bar>的构造函数参数.还有很多其他课程就像Bar一样.每个人都可能需要传递给他们的FooService <TRequestingClass>实例,其中TRequestingClass是需要IFooService实例的类的类型.我不需要向IFooService的消费者公开这个怪癖.他们应该关心的是他们可以调用他们传递的IFooService的方法.他们不应该知道他们传递的IFooService的具体实现需要任何特殊的构造.
FooService <T>的可接受的替代方法是一个非泛型类,在其构造函数中包含一个字符串参数,该参数包含为其创建的类的名称.即:
public class FooService : IFooService
{
public FooService(string requestingClassName) { }
}
Run Code Online (Sandbox Code Playgroud)
如何通过这种方式连接我的IoC容器来构建依赖项?
如果你为什么我想要这样一个奇怪的结构而感到困惑,那么考虑当你得到一个用log4net.LogManager.GetLogger(typeof(SomeClass))创建的ILog时log4net如何工作得最好.我不想通过引用log4net来丢弃我的代码,所以我想编写一个简单的ILogger接口,并用这样的方式实现它:
public class GenericLogger<T> : ILogger
{
private readonly ILog log;
public GenericLogger()
{
this.log = log4net.LogManager.GetLogger(typeof(T));
}
public void Debug(object message)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用StructureMap 2.6.1使用基于约定的注册立即注册我的所有存储库.请参阅下面的代码:
x.Scan(s =>
{
s.TheCallingAssembly();
s.IncludeNamespaceContainingType<RepositoryRegistration>();
s.SingleImplementationsOfInterface();
}
Run Code Online (Sandbox Code Playgroud)
它工作但现在我正在尝试为所有已注册的类型添加生命周期(HybridHttpOrThreadLocalScope).是否可以不从头开始重写SingleImplementationsOfInterface约定,如果是,如何?
谢谢.
我在通过此处的方法" 集中式cookie管理 "中概述的方法进行WCF服务调用时管理共享的auth cookie :http://megakemp.com/2009/02/06/managing-shared-cookies-in- WCF /
我已经建立了一个自定义的IClientMessageInspector,IEndpointBehavior,BehaviorExtensionElement,的作品.我的端点行为添加了一个消息检查器,如下所示:
public class MyEndpointBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
// yuck.. Wish I had an instance of MyClientMessageInspector
// (which has the auth cookie already) so I could just inject that
// instance here instead of creating a new instance
clientRuntime.MessageInspectors.Add(new MyClientMessageInspector());
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
} …Run Code Online (Sandbox Code Playgroud) structuremap wcf dependency-injection wcf-client endpointbehavior
在我的一个类中,我有一个用于单元测试的内部构造函数,以及一个我的应用程序调用的私有构造函数.内部具有我的依赖项的参数,而私有构造函数没有参数,并调用BuildUp使用setter注入.因为代码崩溃了我,并出现以下错误:
StructureMap Exception Code: 245
Error while trying to create an InstanceBuilder for My.Namespace.And.Class, My.Assembly, Version=5.0.0.0, Culture=neutral, PublicKeyToken=null
at StructureMap.Graph.PluginCache.<.cctor>b__1(Type t) in c:\code\structuremap\Source\StructureMap\Graph\PluginCache.cs:line 40
at StructureMap.Util.Cache`2.get_Item(KEY key) in c:\code\structuremap\Source\StructureMap\Util\Cache.cs:line 82
at StructureMap.Graph.PluginCache.FindBuilder(Type pluggedType) in c:\code\structuremap\Source\StructureMap\Graph\PluginCache.cs:line 52
at StructureMap.Container.BuildUp(Object target) in c:\code\structuremap\Source\StructureMap\Container.cs:line 243
at StructureMap.ObjectFactory.BuildUp(Object target) in c:\code\structuremap\Source\StructureMap\ObjectFactory.cs:line 297
Object reference not set to an instance of an object.
at StructureMap.Construction.ConstructorFunctionBuilder`1.CreateBuilder(Plugin plugin) in c:\code\structuremap\Source\StructureMap\Construction\ConstructorFunctionBuilder.cs:line 25
at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.CreateBuilder(Plugin plugin) in c:\code\structuremap\Source\StructureMap\Construction\BuilderCompiler.cs:line 51
at StructureMap.Construction.BuilderCompiler.CreateBuilder(Plugin plugin) in c:\code\structuremap\Source\StructureMap\Construction\BuilderCompiler.cs:line 12
at StructureMap.Graph.PluginCache.<.cctor>b__1(Type …Run Code Online (Sandbox Code Playgroud) 我尝试在结构图中注册命名实例.但我的试验并不成功.
什么是正确的方法?
目前我这样做:
IService bus = CreateInstanceOfServiceBus();
ObjectFactory.Configure(cfg => cfg.For<IServiceBus>()
.AddInstances(x =>x.IsThis(bus)
.Named("foobar"))
.Singleton());
Run Code Online (Sandbox Code Playgroud)
但是当我尝试获取命名实例时,没有找到任何内容:
ObjectFactory.TryGetInstance<IServiceBus>("foobar");
Run Code Online (Sandbox Code Playgroud)
提前致谢.最好的祝福.
约阿希姆
我正在使用C#,MVC4,StructureMap等进行Web解决方案.
在解决方案中,我有控制器服务.举例:
public class ServiceA{
private readonly IRepository _repository1;
private readonly IRepository _repository2;
public ServiceA(IRepository1 repository1, IRepository2 repository2){
_repository1=repository1;
_repository2=repository2;
}
public void DoSomethingA(){
_repository1.DoSomething();
}
public void DoSomethingB(){
_repository2.DoSomething();
}
}
public class ServiceB{
private readonly IRepository _repository3;
private readonly IRepository _repository4;
public ServiceB(IRepository3 repository3, IRepository4 repository4){
_repository3=repository3;
_repository4=repository4;
}
public void DoSomethingA(){
_repository3.DoSomething();
}
public void DoSomethingB(){
_repository4.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这样做是好的做法吗?:
public abstract class ServiceBase(){
public IRepository1 Repository1 { get { return instanceOf<IRepository1>(); }}
public IRepository2 Repository2 { …Run Code Online (Sandbox Code Playgroud) c# structuremap asp.net-mvc dependency-injection recommendation-engine
我们正在使用ASP.Net MVC 3.0框架开发一个应用程序.我们使用structuremap在运行时注入对象.为此我们正在使用构造函数注入.我们已经编写了自定义控制器工厂,通过该工厂将控制器的创建委托给该工厂return (Controller)ObjectFactory.GetInstance(controllerType);.通过将接口映射到具体类来定义使用DSL的定义.
当应用程序在visual studio开发服务器上运行时,一切正常.但是当在IIS 7.0上部署相同的应用程序时,在运行时创建对象时会抛出207错误.
任何人都可以帮助我们是否需要更新IIS上的任何设置或帮助调试此问题的步骤?请找到问题的下面的堆栈跟踪
ExceptionStructureMap Exception Code:
207 Internal exception while creating Instance '83248ea8-b195-4166-8a7d-678e9a677c9f' of PluginType Payrs.Web.Controllers.PaymentRequestController.
Check the inner exception for more details.Stack Trace :
at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)
at StructureMap.Pipeline.ConstructorInstance.build(Type pluginType, BuildSession session)
at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)
at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)
at StructureMap.BuildSession.<>c__DisplayClass3.<.ctor>b__1()
at StructureMap.BuildSession.CreateInstance(Type pluginType)
at Payrs.Web.Infrastructure.PayrsControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
**Inner Exception**
at Payrs.Web.Controllers.PaymentRequestController..ctor(IPaymentService …Run Code Online (Sandbox Code Playgroud) 在使用最新的StructureMap版本(3.1.6.191)升级我们的解决方案后,我收到了很多过时的警告.这些警告来自StructureMap,ObjectFactory在将来的版本中将弃用该类(4.0+).
我正在使用WCF,我们希望使用以下的实现让StructureMap挂钩在WCF管道中IInstanceProvider:
public class StructureMapInstanceProvider : IInstanceProvider
Run Code Online (Sandbox Code Playgroud)
这个类用来ObjectFactory获取一个实例,当我的容器中没有静态类来解决它时,我们怎么能得到一个类型的实例呢?