一 简单介绍
StructureMap is the oldest, continuously used IoC/DI container for .Net dating back to its first public release and production usage all the way back in June 2004 on .Net 1.1. The current 4.* release represents 12+ years of lessons learned in the StructureMap and greater .Net community -- while also wiping away a great deal of legacy design decisions that no longer make sense today.
StructureMap是.Net最早的,连续使用的IoC / DI容器,可以追溯到2004年6月在.Net 1.1上的第一次公开发布和生产使用。 当前的4. *版本代表了在StructureMap和更大的.Net社区中学到的12年多的经验教训 - 同时也消除了大量遗留的设计决策,这些决策今天已经不再有意义了。
StructureMap是一个IOC框架,至于什么是IOC不做过多解释,网上有很多资料,这里主要是演示下简单的用法
简单用法
-
新建控制台项目,项目结构如下
-
新建Interfacec层,Service层和Repository层,分别表示接口层,业务层和数据仓储层,Service有两个,主要演示了Setter和Ctor注册两种情况
Interface层
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IOrderRepository { void GetOrdersByUserId(string userId); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IOrderService { void GetOrdersByUserId(string userId); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IUserRepository { void GetUserById(int id); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IUserService { void GetUserById(int id); } }
Service层
using Learn_StructureMap.Interface; using System; namespace Learn_StructureMap.Service { public class UserService : IUserService { private IUserRepository userRepository; public UserService(IUserRepository userRepository) { this.userRepository = userRepository; } public void GetUserById(int id) { Console.WriteLine("UserService 执行"); this.userRepository.GetUserById(10); } } } using Learn_StructureMap.Interface; using StructureMap.Attributes; using System; namespace Learn_StructureMap.Service { public class OrderService : IOrderService { [SetterProperty] public IOrderRepository orderRepository { get; set; } public void GetOrdersByUserId(string userId) { Console.WriteLine("OrderService 执行"); this.orderRepository.GetOrdersByUserId(userId); } } }
Repository层
using System; using Learn_StructureMap.Interface; namespace Learn_StructureMap.Init { public class OrderRepository : IOrderRepository { public void GetOrdersByUserId(string userId) { Console.WriteLine("OrderRepository 执行"); } } } using Learn_StructureMap.Interface; using System; namespace Learn_StructureMap.DataAccess { public class UserRepository : IUserRepository { public void GetUserById(int id) { Console.WriteLine("UserRepository 执行"); } } }
接下来最重要的,初始化IOC容器,将需要的服务注入到该容器之后,在需要的地方就可以直接拿来用了
using StructureMap; namespace Learn_StructureMap.Init { public class ContainerFactory { public static Container container = null; static ContainerFactory() { container = new Container(); container.Configure(it => { it.AddRegistry<IOCRegister>(); }); } } } using Learn_StructureMap.DataAccess; using Learn_StructureMap.Interface; using Learn_StructureMap.Service; using StructureMap; namespace Learn_StructureMap.Init { public class IOCRegister : Registry { public IOCRegister() { //Service //setter inject For<IOrderService>().Singleton().Use<OrderService>().Setter<IOrderRepository>().Is<OrderRepository>(); //ctor inject For<IUserService>().ContainerScoped().Use<UserService>().Ctor<IUserRepository>().Is<UserRepository>(); //Repository For<IUserRepository>().Singleton().Use<UserRepository>(); For<IOrderRepository>().Singleton().Use<OrderRepository>(); } } }
UI层,主要演示如何获取服务,并调用服务方法
using Learn_StructureMap.Init; using Learn_StructureMap.Interface; using System; namespace Learn_StructureMap { class Program { static void Main(string[] args) { var container = ContainerFactory.container; IUserService userService = container.GetInstance<IUserService>(); userService.GetUserById(10); IOrderService orderService = container.GetInstance<IOrderService>(); orderService.GetOrdersByUserId("u1"); Console.ReadKey(); } } }
-
运行结果如下: