我试图让Unity管理我的对象的创建,我希望有一些在运行时才知道的初始化参数:
目前,我能想到的方法是在接口上使用Init方法.
interface IMyIntf {
void Initialize(string runTimeParam);
string RunTimeParam { get; }
}
Run Code Online (Sandbox Code Playgroud)
然后使用它(在Unity中)我会这样做:
var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,runTimeParamparam是在运行时根据用户输入确定的.这里的简单案例只返回值,runTimeParam但实际上参数将类似于文件名,初始化方法将对文件执行某些操作.
这会产生许多问题,即该Initialize方法在界面上可用并且可以多次调用.在实现中设置一个标志并在重复调用时抛出异常Initialize似乎很笨重.
在解析我的界面时,我不想知道有关实现的任何信息IMyIntf.但是,我想要的是知道这个接口需要一定的一次初始化参数.有没有办法以某种方式注释(属性?)具有此信息的接口,并在创建对象时将它们传递给框架?
编辑:更多地描述了界面.
interface-design dependency-injection ioc-container inversion-of-control unity-container
我理解DI背后的概念,但我只是在学习不同的IoC容器可以做什么.似乎大多数人都主张使用IoC容器来连接无状态服务,但是如何将它们用于实体等有状态对象呢?
无论是对还是错,我通常会用行为填充我的实体,即使这种行为需要外部类.例:
public class Order : IOrder
{
private string _ShipAddress;
private IShipQuoter _ShipQuoter;
public Order(IOrderData OrderData, IShipQuoter ShipQuoter)
{
// OrderData comes from a repository and has the data needed
// to construct order
_ShipAddress = OrderData.ShipAddress; // etc.
_ShipQuoter = ShipQuoter;
}
private decimal GetShippingRate()
{
return _ShipQuoter.GetRate(this);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,依赖项是Constructor Injected.现在提出几个问题.
让您的实体依赖于诸如ShipQuoter之类的外部类别是否被视为不良做法?如果我正确理解定义,消除这些依赖性似乎会导致我陷入贫血领域.
使用IoC容器来解决这些依赖关系并在需要时构建实体是不好的做法吗?是否有可能做到这一点?
感谢您的任何见解.
entities dependency-injection castle-windsor ioc-container inversion-of-control
entities ×1