您是否可以覆盖命名实例的构造函数参数,似乎您只能为默认实例执行此操作.
我想要做:
ObjectFactory.With("name").EqualTo("Matt").GetNamedInstance<IActivity>("soccer");
Run Code Online (Sandbox Code Playgroud) 我已经读过NHibernate 2.1支持构造函数依赖注入的地方.
如何配置StructureMap和NHibnerate 2.1以使其正常运行?
我使用以下内容:
public interface IRepository<T>
{
void Add(T entity);
}
public class Repository<T>
{
private readonly ISession session;
public Repository(ISession session)
{
this.session = session;
}
public void Add(T entity)
{
session.Save(entity);
}
}
public class SomeHandler : IHandleMessages<SomeMessage>
{
private readonly IRepository<EntityA> aRepository;
private readonly IRepository<EntityB> bRepository;
public SomeHandler(IRepository<EntityA> aRepository, IRepository<EntityB> bRepository)
{
this.aRepository = aRepository;
this.bRepository = bRepository;
}
public void Handle(SomeMessage message)
{
aRepository.Add(new A(message.Property);
bRepository.Add(new B(message.Property);
}
}
public class MessageEndPoint : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization
{
public …Run Code Online (Sandbox Code Playgroud) 在我的领域中,我有一些“处理器”类,它们包含大部分业务逻辑。使用带有默认约定的StructureMap,我将存储库注入这些类的各种IO(数据库,文件系统等)中。例如:
public interface IHelloWorldProcessor
{
string HelloWorld();
}
public class HelloWorldProcessor : IHelloWorldProcessor
{
private IDBRepository _dbRepository;
public HelloWorldProcessor(IDBRepository dbRepository)
{
_dbRepository = dbrepository;
}
public string HelloWorld(){ return _dbRepository.GetHelloWorld(); }
}
Run Code Online (Sandbox Code Playgroud)
现在,有一些存储库可供所有处理器使用,因此我做了一个基类,如下所示:
public class BaseProcessor
{
protected ICommonRepository _commonRepository;
public BaseProcessor(ICommonRepository commonRepository)
{
_commonRepository = commonRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我的其他处理器继承自该处理器时,每个处理器都会收到一个编译器错误,说没有BaseProcessor的构造函数,该构造函数采用零参数。
有没有办法做我想在这里做的事情?就是说,是否要将公共依赖项注入到我的其他类可以使用的基类中,而不必将注入内容写入每个基类中?
与此问题相关,但这个问题与StructureMap有关.
我有以下接口定义:
public interface ICommandHandler
{
ILogger Logger { get; set; }
bool SendAsync { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有多个实现,ICommandHandler需要解决.我想在实现的实例中自动注入这两个属性ICommandHandler.
我找到了一种方法来执行注入ILogger,让所有实现都从基类型和[SetterProperty]属性继承:
public abstract class BaseCommandHandler : ICommandHandler
{
[SetterProperty]
public ILogger Logger { get; set; }
public bool SendAsync { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然而,这并没有帮助我bool在所有实现中注入基本类型.
命令处理程序实现从基接口继承的通用接口:
public interface ICommandHandler<TCommand> : ICommandHandler
where TCommand : Command
{
void Handle(TCommand command);
}
Run Code Online (Sandbox Code Playgroud)
这是我目前的配置:
var container = new Container();
container.Configure(r => …Run Code Online (Sandbox Code Playgroud) 我正在使用SpecFlow和Nunit,我正在尝试使用TestFixtureSetUpAttribute设置我的环境测试,但它从未被调用过.
我已经尝试过使用MSTests和ClassInitialize属性,但同样的事情发生了.该函数未被调用.
任何想法为什么?
[Binding]
public class UsersCRUDSteps
{
[NUnit.Framework.TestFixtureSetUpAttribute()]
public virtual void TestInitialize()
{
// THIS FUNCTION IS NEVER CALLER
ObjectFactory.Initialize(x =>
{
x.For<IDateTimeService>().Use<DateTimeService>();
});
throw new Exception("BBB");
}
private string username, password;
[Given(@"I have entered username ""(.*)"" and password ""(.*)""")]
public void GivenIHaveEnteredUsernameAndPassword(string username, string password)
{
this.username = username;
this.password = password;
}
[When(@"I press register")]
public void WhenIPressRegister()
{
}
[Then(@"the result should be default account created")]
public void ThenTheResultShouldBeDefaultAccountCreated()
{
}
Run Code Online (Sandbox Code Playgroud)
解:
[Binding]
public class UsersCRUDSteps …Run Code Online (Sandbox Code Playgroud) 我是DI概念的新手,也是结构图的新手.我正在尝试完全填充我的所有接口都在其中AssemblyA并且我的所有实现都在的场景AssemblyB.我想使用Structuremap AssemblyB在依赖于接口的构造函数中注入类的实例AssemblyA
public class Customer(ICustomerService)
{
}
Run Code Online (Sandbox Code Playgroud)
ICustomerService在AssemblyA和CustomerService班级在assemblyB.我希望Structuremap CustomerService在此构造函数中注入实例.我假设如果类的名称与前缀为和的接口名称相同I.Structuremap将自动识别它.
我写了以下配置.
x =>
{
x.Scan(scan =>
{
scan.Assembly("AssemblyA");
scan.Assembly("AssemblyB");
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
Run Code Online (Sandbox Code Playgroud)
但它给了我错误
StructureMap Exception Code: 202
No Default Instance defined for PluginFamily AssemblyA.ICustomerService, AssemblyA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Run Code Online (Sandbox Code Playgroud)
我想使用默认约定,并避免将每个接口注册到类.
在StructureMap中,如何在特定的Container实例上释放和处理Http范围的对象?对于Object Factory中的默认intance,我可以执行该方法ReleaseAndDisposeAllHttpScopedObjects(),但Container类和IContainer接口似乎没有这样的方法.
任何人都可以指点我的一些样品或指示如何实现这一目标吗?
我的界面定义如下:
public interface IApplicationSettings
{
string LoggerName { get; }
string NumberOfResultsPerPage { get; }
string EmailAddress { get; }
string Credential { get; }
}
Run Code Online (Sandbox Code Playgroud)
该接口的实现如下:
public class WebConfigApplicationSettings : IApplicationSettings
{
public string LoggerName
{
get { return ConfigurationManager.AppSettings["LoggerName"]; }
}
public string NumberOfResultsPerPage
{
get { return ConfigurationManager.AppSettings["NumberOfResultsPerPage"]; }
}
public string EmailAddress
{
get { return ConfigurationManager.AppSettings["EmailAddress"]; }
}
public string Credential
{
get { return ConfigurationManager.AppSettings["Credential"]; }
}
}
Run Code Online (Sandbox Code Playgroud)
我还创建了一个工厂类来获取WebConfigSettings具体实现的实例,如下所示:
public class ApplicationSettingsFactory
{
private …Run Code Online (Sandbox Code Playgroud) structuremap ×10
c# ×2
nhibernate ×2
.net ×1
asp.net-mvc ×1
constructor ×1
dependencies ×1
httpcontext ×1
inheritance ×1
nservicebus ×1
nunit ×1
specflow ×1