C# MVC3&;StructureMap,基于控制器注入具体类

C# MVC3&;StructureMap,基于控制器注入具体类,c#,asp.net-mvc-3,structuremap,C#,Asp.net Mvc 3,Structuremap,假设我的几个控制器构造函数接受一个接口-IPetInterface IPetInterface有3个具体实现 您将如何配置StructureMap以根据需要它的控制器提供一个具体实现 粗糙的例子 class DogStuff: IPetInterface{} class CatStuff: IPetInterface{} class GiraffeStuff: IPetInterface{} class DogController : Controller { DogControl

假设我的几个控制器构造函数接受一个接口-IPetInterface IPetInterface有3个具体实现

您将如何配置StructureMap以根据需要它的控制器提供一个具体实现

粗糙的例子

class DogStuff: IPetInterface{}

class CatStuff: IPetInterface{}

class GiraffeStuff: IPetInterface{}

class DogController : Controller
{
    DogController(IPetInterface petStuff)

    // some other stuff that is very unique to dogs
}

class CatController : Controller
{
    CatController(IPetInterface petStuff)

    // some other stuff that is very unquie to cats
}
试试这个:

class Stuff<T> : IPetInterface<T> where T : IPet { ... }

interface IPetInterface<T> where T : IPet { ... }

abstract class PetController<T> : Controller where T : IPet
{
    protected PetController<T>(IPetInterface<T> stuff)
    { ... }
}

class CatController : PetController<Cat>
{
    public CatController(IPetInterface<Cat> stuff) : base(stuff) {}

    ...
}

class DogController : PetController<Dog> { ... }
class Stuff:IPetInterface其中T:IPet{…}
接口IPetterface,其中T:IPet{…}
抽象类PetController:Controller,其中T:IPet
{
受保护的PetController(IPetterface内容)
{ ... }
}
类别CatController:PetController
{
公共CatController(IPetterface stuff):基本(stuff){}
...
}
类DogController:PetController{…}
试试这个:

class Stuff<T> : IPetInterface<T> where T : IPet { ... }

interface IPetInterface<T> where T : IPet { ... }

abstract class PetController<T> : Controller where T : IPet
{
    protected PetController<T>(IPetInterface<T> stuff)
    { ... }
}

class CatController : PetController<Cat>
{
    public CatController(IPetInterface<Cat> stuff) : base(stuff) {}

    ...
}

class DogController : PetController<Dog> { ... }
class Stuff:IPetInterface其中T:IPet{…}
接口IPetterface,其中T:IPet{…}
抽象类PetController:Controller,其中T:IPet
{
受保护的PetController(IPetterface内容)
{ ... }
}
类别CatController:PetController
{
公共CatController(IPetterface stuff):基本(stuff){}
...
}
类DogController:PetController{…}

使用问题中提供的类和接口,此注册将执行以下操作:

For<DogController>().Use<DogController>()
  .Ctor<IPetInterface>("petStuff").Is<DogStuff>();
For<CatController>().Use<CatController>()
  .Ctor<IPetInterface>("petStuff").Is<CatStuff>();
For<GiraffeController>().Use<GiraffeController>()
  .Ctor<IPetInterface>("petStuff").Is<GiraffeStuff>();
For()。使用()
.Ctor(“petStuff”).Is();
For().Use()
.Ctor(“petStuff”).Is();
For().Use()
.Ctor(“petStuff”).Is();

如果这超过了3个相同模式的注册,我会考虑使用基于约定的注册,而不是根据命名为每个控制器自动注册相应的“东西”。这是可以实现的。

通过问题中提供的类和接口,此注册可以:

For<DogController>().Use<DogController>()
  .Ctor<IPetInterface>("petStuff").Is<DogStuff>();
For<CatController>().Use<CatController>()
  .Ctor<IPetInterface>("petStuff").Is<CatStuff>();
For<GiraffeController>().Use<GiraffeController>()
  .Ctor<IPetInterface>("petStuff").Is<GiraffeStuff>();
For()。使用()
.Ctor(“petStuff”).Is();
For().Use()
.Ctor(“petStuff”).Is();
For().Use()
.Ctor(“petStuff”).Is();

如果这超过了3个相同模式的注册,我会考虑使用基于约定的注册,而不是根据命名为每个控制器自动注册相应的“东西”。这是可以做到的。

虽然我确信StructureMap可以做到(我自己更像是一个团结的人,所以我不确定如何使用StructureMap做到这一点),但你确定你的设计是正确的吗?根据您的描述,界面可能太通用了……@BFree:可能太通用了。目前,我为每个“宠物”都有单独的接口,但它们是相同的,所以我想知道这是否可能/值得,尽管我确信可以用StructureMap实现(我自己更喜欢Unity,所以我不确定如何用StructureMap实现),你确定你的设计是正确的吗?根据您的描述,界面可能太通用了……@BFree:可能太通用了。目前我为每个“宠物”都有单独的界面,但它们是相同的,所以我想知道这是否可能/值得,而汉克斯,正是我想要的那种信息!谢谢,这正是我想要的信息!