标签: structuremap

如何使用结构图获取泛型类的所有实例

在结构图中,我有以下行处理域事件:

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

安德鲁

.net c# structuremap

4
推荐指数
1
解决办法
2398
查看次数

使用Structuremap更改范围的多个构造函数?

为了说明问题,这是我的设置的简化版本.我有一个像这样的工厂:

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"

如果我喜欢这样: …

.net structuremap ioc-container object-lifetime

4
推荐指数
1
解决办法
2094
查看次数

StructureMap单例因参数而异吗?

使用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

4
推荐指数
1
解决办法
430
查看次数

具有多个装饰器的装饰器图案和结构图

我正在尝试使用结构图连接一系列装饰器,但我遇到了一些问题.

我已经阅读了这个问题,这让我能够拥有一个装饰类,但我似乎无法让多个级别的装饰工作.我所拥有的是类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不在堆栈的任何地方.

我究竟做错了什么?

structuremap dependency-injection

4
推荐指数
1
解决办法
1027
查看次数

没有无参数构造函数,结构图,新区域

我知道错误"没有为此对象定义的无参数构造函数"已被问过一百万次.我的情况有所不同

我有一个工作的应用程序.许多控制器和一个有很多控制器的区域.我刚刚添加了一个新区域.我添加了一个控制器,然后是该控制器的链接.现在我得到"为此对象定义的无参数构造函数"错误

我之前已经看到并克服了这个问题,但它实际上只发生在每5个月一次.每次我完全忘记(压抑)答案.

请帮忙

RAIF

structuremap asp.net-mvc compiler-errors asp.net-mvc-areas

4
推荐指数
1
解决办法
3331
查看次数

Autofac vs. Structuremap,如何注入接口的所有实例?

在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 autofac

4
推荐指数
1
解决办法
2319
查看次数

Structuremap没有为此对象定义的无参数构造函数

我是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)

structuremap asp.net-mvc asp.net-mvc-4

4
推荐指数
1
解决办法
7195
查看次数

处理注入的HttpClient

我们的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

4
推荐指数
1
解决办法
1726
查看次数

构造函数依赖注入WebApi属性

我一直在寻找WebApi属性的非参数注入选项.

我的问题是使用Structuremap是否真的可以实现这一点?

我一直在谷歌搜索,但继续提出属性注入(我不喜欢使用)或假设的构造函数注入的实现,我到目前为止无法复制.

我选择的容器是Structuremap,但是任何这样的例子就足够了,因为我能够转换它.

有人管过这个吗?

structuremap dependency-injection custom-attributes asp.net-web-api structuremap3

4
推荐指数
1
解决办法
8197
查看次数

'StructureMap.ObjectFactory'已过时

我使用StructureMap实现了一个接口注入,如下所述.

ObjectFactory.Initialize(x => { x.For<*IRepository*>().Use<*SQLRepository*>(); });
Run Code Online (Sandbox Code Playgroud)

但它发出如下警告

警告2'StructureMap.ObjectFactory'已过时:'ObjectFactory将在StructureMap的未来4.0版本中删除.支持使用Container类进行未来的工作.

如何使用Container类更正此问题

c# structuremap dependency-injection

4
推荐指数
1
解决办法
7796
查看次数