IOC框架---StructureMap


一 简单介绍

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不做过多解释,网上有很多资料,这里主要是演示下简单的用法

简单用法

  1. 新建控制台项目,项目结构如下

  2. 新建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();
            }
        }
    }
    
    
  3. 运行结果如下:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM