您如何将此功能修改为IOC?

时间:2009-04-15 16:14:40

标签: inversion-of-control

我有一个简单的功能,只想知道如何将我的编码风格转换为IOC。

public User GetUserByID(int userID)
{
   DataProvider dp = new DataProvider();

   return dp.GetUserByID(userID);
}

我的dataprovider是简单的ADO.net,它打开一个连接,调用sproc并返回User对象。

2 个答案:

答案 0 :(得分:1)

这是使用IoC的典型方式:

public interface IDataProvider
{
   User GetUserByID(int userID);
}

...

class Client
{
   // Client gets the IDataProvider as a mandatory constructor parameter
   public Client (IDataProvider dataProvider)
   {
      this.dataProvider = dataProvider;
   }

   public User GetUserByID(int userID)
   {
      return dataProvider.GetUserById (userID);
   }

   private IDataProvider dataProvider;
}

...

void Main()
{
   // create IoC container of your choice...
   IoCContainer container = new IoCContainer();
   // ... and then configure it (from a config. file or programmatically)
   container.Configure ();

   // create the Client instance using the container
   // note that the container takes care of creating appropriate IDataProvider 
   // for you
   Client client = container.GetService<Client>();
   User user = client.GetUserByID ("john doe");
}

您的示例唯一的问题是您的客户端类的方法并没有真正为代码添加任何值 - 它只是将调用转发给数据提供者。

答案 1 :(得分:0)

不是在方法中显式创建DataProvider的实例,而是将其作为参数传递给方法。在您的方法之外,您可以创建工厂类来创建DataProvider的实例或使用像Unity这样的IOC容器。