在结构图中,我有以下行处理域事件:
public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
foreach (var handler in ObjectFactory.GetAllInstances<IDomainEventHandler<TEvent>>())
{
if (handler.IsActive)
handler.Handle(eventToDispatch);
}
}
Run Code Online (Sandbox Code Playgroud)
我在StructureMap注册表中注册这些:
x.AddAllTypesOf(typeof(IDomainEventHandler<>));
Run Code Online (Sandbox Code Playgroud)
上面的第一个块引发了一个Unknown错误 - Structure Map Code 400.有谁知道如何从strcuture map容器中获取特定类型的泛型类?
TIA
安德鲁
为了说明问题,这是我的设置的简化版本.我有一个像这样的工厂:
public interface IFactory{ }
public class Factory : IFactory
{
public Factory()
{
Console.WriteLine("parameterless");
}
//public Factory(int i)
//{
// Console.WriteLine("with parameter : {0}", i);
//}
}
Run Code Online (Sandbox Code Playgroud)
测试它的程序是一个consoleApp.足以证明我的观点.
static void Main(string[] args)
{
Init();
var factory1 = ObjectFactory.GetInstance<IFactory>();
var factory2 = ObjectFactory.GetInstance<IFactory>();
var factory3 = ObjectFactory.GetInstance<IFactory>();
Console.Read();
}
Run Code Online (Sandbox Code Playgroud)
我在我的Init静态方法中设置了strucutreMap.
public static void Init()
{
ObjectFactory.Initialize(x =>
{
//insert Initialization code here.
});
}
Run Code Online (Sandbox Code Playgroud)
如果我只有一个构造函数并设置StructureMap,如下所示:
x.For<IFactory>().Use<Factory>();
Run Code Online (Sandbox Code Playgroud)
工作完美,输出显示无
参数无
参数无
参数
每次调用都会构建一个新实例.
现在,如果我取消注释第二个构造函数,但我想使用无参数构造函数,并使用相同的默认生活方式.我该怎么办?
我试过了:
x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();
Run Code Online (Sandbox Code Playgroud)
它不起作用:缺少InstanceKey的请求实例属性"i"
如果我喜欢这样: …
使用StructureMap,是否可以为参数的每个值设置一个单独的对象?例如,假设我想为多租户网络应用中的每个网站维护一个不同的单例:
For<ISiteSettings>().Singleton().Use<SiteSettings>();
Run Code Online (Sandbox Code Playgroud)
我想维护一个与每个站点对应的不同单例对象:
ObjectFactory.With<string>(requestHost).GetInstance<ISiteSettings>();
Run Code Online (Sandbox Code Playgroud)
目前,每当我尝试解析ISiteSettings时,它似乎都会创建一个新对象.
.net structuremap asp.net-mvc dependency-injection inversion-of-control
我正在尝试使用结构图连接一系列装饰器,但我遇到了一些问题.
我已经阅读了这个问题,这让我能够拥有一个装饰类,但我似乎无法让多个级别的装饰工作.我所拥有的是类A,它将连接字符串作为参数,然后是类B和类C,它们都是类A的装饰器.我可以使用结构图创建包装A的B但是我似乎无法获得C包装B包装一个.
这适用于1级:
For<IQuestionRepository> ()
.Use<LinqToSqlQuestionRepository> ()
.Ctor<string>("connectionString")
.Is(x=>System.Configuration.ConfigurationManager.ConnectionStrings["aspnetdbConnectionString"].ConnectionString)
.EnrichWith (x=>new RecentQuestionCachedRepository(x))
Run Code Online (Sandbox Code Playgroud)
我认为只需添加另一个EnrichWith就可以这样工作:
For<IQuestionRepository> ()
.Use<LinqToSqlQuestionRepository> ()
.Ctor<string>("connectionString")
.Is(x=>System.Configuration.ConfigurationManager.ConnectionStrings["aspnetdbConnectionString"].ConnectionString)
.EnrichWith (x=>new RecentQuestionCachedRepository(x))
.EnrichWith (y=>new FeaturedQuestionCachedRepository(y));
Run Code Online (Sandbox Code Playgroud)
但这只是给了我一个包含LinqToSqlQuestionRepository的FeaturedQuestionCachedRepository,但是RecentQuestionCachedRepository不在堆栈的任何地方.
我究竟做错了什么?
我知道错误"没有为此对象定义的无参数构造函数"已被问过一百万次.我的情况有所不同
我有一个工作的应用程序.许多控制器和一个有很多控制器的区域.我刚刚添加了一个新区域.我添加了一个控制器,然后是该控制器的链接.现在我得到"为此对象定义的无参数构造函数"错误
我之前已经看到并克服了这个问题,但它实际上只发生在每5个月一次.每次我完全忘记(压抑)答案.
请帮忙
RAIF
在autoFac中,我可以注册一个接口的多个实现.当autofac实例化我的对象时,所有实例都将传递给构造函数.
来自autofac的文档:这里
例如,当Autofac注入IEnumerable类型的构造函数参数时,它不会查找提供IEnumerable的组件.相反,容器将找到ITask的所有实现并注入所有这些实现.
StructureMap中是否提供此功能?
对于我的课程:
public interface IFoo
{
}
public class Foo1 : IFoo
{
}
public class Foo2 : IFoo
{
}
public class UsingFoo
{
public UsingFoo(IEnumerable<IFoo> allFoos)
{
foreach (var foo in allFoos)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何注册我的实现,以便在实例化UsingFoo时,构造函数将传递IFoo的所有实现?
我是StructureMap的新手,我一直试图解决这个错误已经有一段时间了.只是无法弄清楚如何解决它以及我在哪里做错了.我甚至设置了一个MVC4模板网站,其中没有任何内容,但仍然出现错误.
有人可以帮帮我吗?
public static class IoC {
public static IContainer Initialize() {
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.For<IDbSession>().Use(() => MvcApplication.DbSession);
x.For<IDbService>().Use<DbService>();
});
return ObjectFactory.Container;
}
}
Run Code Online (Sandbox Code Playgroud)
public class HomeController : Controller
{
protected readonly IDbService _dbService;
public HomeController(IDbService dbService)
{
_dbService = dbService;
}
...
}
Run Code Online (Sandbox Code Playgroud)
public interface IDbSession : IDisposable
{
void Commit();
void Rollback();
}
Run Code Online (Sandbox Code Playgroud)
public interface IDbService
{
StudentsService Students { get; }
CoursesService Courses { get; }
...
}
Run Code Online (Sandbox Code Playgroud)
public class DbService …Run Code Online (Sandbox Code Playgroud) 我们的MVC应用程序使用HttpClient调用WebAPI操作.我决定使用StructureMap注入HttpClient并在控制器中覆盖dispose
public HomeController(HttpClient httpClient)
{
_httpClient = httpClient;
}
protected override void Dispose(bool disposing)
{
if (disposing && _httpClient != null)
{
_httpClient.Dispose();
}
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
StructureMap ObjectInitialize基本上看起来像这样..
x.For<HttpClient>().Use(() => new HttpClient() { BaseAddress = "my/uri/"});
Run Code Online (Sandbox Code Playgroud)
当我构建它时,CodeAnalysis会抱怨"Dispose objects before losing scope"并指向IoC代码.
我可以抑制它,或者我需要在何处处理HttpClient?我也试过了
protected void Application_EndRequest(object sender, EventArgs e)
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
Run Code Online (Sandbox Code Playgroud)
但我仍然违反规则.
structuremap dependency-injection asp.net-mvc-4 asp.net-web-api dotnet-httpclient
我一直在寻找WebApi属性的非参数注入选项.
我的问题是使用Structuremap是否真的可以实现这一点?
我一直在谷歌搜索,但继续提出属性注入(我不喜欢使用)或假设的构造函数注入的实现,我到目前为止无法复制.
我选择的容器是Structuremap,但是任何这样的例子就足够了,因为我能够转换它.
有人管过这个吗?
structuremap dependency-injection custom-attributes asp.net-web-api structuremap3
我使用StructureMap实现了一个接口注入,如下所述.
ObjectFactory.Initialize(x => { x.For<*IRepository*>().Use<*SQLRepository*>(); });
Run Code Online (Sandbox Code Playgroud)
但它发出如下警告
警告2'StructureMap.ObjectFactory'已过时:'ObjectFactory将在StructureMap的未来4.0版本中删除.支持使用Container类进行未来的工作.
如何使用Container类更正此问题